960 likes | 1.25k Views
第三章 80486 微处理器指令系统. 第一节 80486 微处理器寻址方式. 第二节 80486 微处理器指令系统. 第一节 80486 微处理器的寻址方式. 要使微处理器能够完成指令规定的操作,则指令中须包含 2 种信息 : 执行什么操作 该操作所涉及的数据在哪里和结果存于何处 寻找操作数所在地址的方法即为 寻址方式 (Addressing Mode) 。 80X86 的 寻址方式 可分为两类: 操作数的寻址方式 和 转移地址的寻址方式 。. 第一节 80486 微处理器的寻址方式. 一、操作数寻址方式.
E N D
第三章 80486微处理器指令系统 第一节 80486微处理器寻址方式 第二节 80486微处理器指令系统
第一节 80486微处理器的寻址方式 要使微处理器能够完成指令规定的操作,则指令中须包含2种信息: 执行什么操作 该操作所涉及的数据在哪里和结果存于何处 寻找操作数所在地址的方法即为寻址方式(Addressing Mode)。 80X86的寻址方式可分为两类: 操作数的寻址方式和转移地址的寻址方式。
第一节 80486微处理器的寻址方式 一、操作数寻址方式 由于操作数作为指令的操作对象,可以存储在存储器中(称为存储器操作数)、寄存在寄存器中(称为寄存器操作数)或直接包含在指令中(称为立即数),因此,与之对应有多种寻址方式。80X86粗略地划分可有3类10种寻址方式,其中访问存储器操作数有8种寻址方式。
以第一条指令为例的立即数寻址方式的执行过程如图。以第一条指令为例的立即数寻址方式的执行过程如图。 立即寻址示意图 (1)立即数寻址 在这种寻址的方式下,操作数作为立即数直接存在指令中,可为8位,16位和32位。 例: MOV AX,1234H MOV BL,78H MOV ECX,12345678H (2)寄存器寻址 在这种方式下,操作数存放在CPU某个8位、16位或32 位寄存器中。 例: MOV EAX,EDX INC CL MOV DS,AX 该寻址方式指令码短,且无需从存储器取操作数,故执行速度快
存储器寻址方式:由指令给出将访问的存储器单元的逻辑地址,其中,段地址由段寄存器得到,偏移地址(有效地址EA)由寻址方式计算得到.存储器寻址方式:由指令给出将访问的存储器单元的逻辑地址,其中,段地址由段寄存器得到,偏移地址(有效地址EA)由寻址方式计算得到. 段寄存器的确定:(1)在指令中给出(2)由寄存器隐含 偏移地址的确定:根据寻址方式确定
存储器寻址完全格式:相对基址比例变址 段寄存器:[ 基址寄存器 + 比例因子 × 变址寄存器 + 位移量 ] 或:段寄存器:位移量[ 基址寄存器 + 比例因子 × 变址寄存器 ] 或:段寄存器:位移量[ 基址寄存器 ][ 比例因子 × 变址寄存器 ] 共演变出8种方式: (1)直接寻址(16/32寻址) (2)寄存器间接寻址(16/32寻址) (3)寄存器相对寻址(16/32寻址) (4)基址变址寻址(16/32寻址) (5)相对基址变址寻址(16/32寻址) (6)(相对)比例变址寻址(32寻址) (7)基址比例变址寻址(16/32寻址) (8)相对基址比例变址(16/32寻址) 说明(1)16位寻址的基址寄存器BX,BP;变址寄存器SI,DI 其中BP隐含SS段,BX,SI,DI隐含DS段 (2)32位寻址的基址及变址寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP 其中EBP,ESP隐含SS段,其余隐含DS段 (3)ESP不能用于寻址方式(6),即(相对)比例变址寻址
存储器寻址完全格式:相对基址比例变址 段寄存器:[ 基址寄存器 + 比例因子 × 变址寄存器 + 位移量 ] 或:段寄存器:位移量[ 基址寄存器 + 比例因子 × 变址寄存器 ] 或:段寄存器:位移量[ 基址寄存器 ][ 比例因子 × 变址寄存器 ] 共演变出8种方式: (1)直接寻址(16/32寻址) (2)寄存器间接寻址(16/32寻址) (3)寄存器相对寻址(16/32寻址) (4)基址变址寻址(16/32寻址) (5)相对基址变址寻址(16/32寻址) (6)(相对)比例变址寻址(32寻址) (7)基址比例变址寻址(16/32寻址) (8)相对基址比例变址(16/32寻址) MOV AX,DS:[1000H] 说明(1)16位寻址的基址寄存器BX,BP;变址寄存器SI,DI 其中BP隐含SS段,BX,SI,DI隐含DS段 (2)32位寻址的基址及变址寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP 其中EBP,ESP隐含SS段,其余隐含DS段 (3)ESP不能用于寻址方式(6),即(相对)比例变址寻址
存储器寻址完全格式:相对基址比例变址 段寄存器:[ 基址寄存器 + 比例因子 × 变址寄存器 + 位移量 ] 或:段寄存器:位移量[ 基址寄存器 + 比例因子 × 变址寄存器 ] 或:段寄存器:位移量[ 基址寄存器 ][ 比例因子 × 变址寄存器 ] 共演变出8种方式: (1)直接寻址(16/32寻址) (2)寄存器间接寻址(16/32寻址) (3)寄存器相对寻址(16/32寻址) (4)基址变址寻址(16/32寻址) (5)相对基址变址寻址(16/32寻址) (6)(相对)比例变址寻址(32寻址) (7)基址比例变址寻址(16/32寻址) (8)相对基址比例变址(16/32寻址) MOV AX,[SI];DS MOV AX,[BP];SS MOV AX,[ESI];DS MOV AX,ES:[ESI];ES MOV EAX,[ESP];SS 说明(1)16位寻址的基址寄存器BX,BP;变址寄存器SI,DI 其中BP隐含SS段,BX,SI,DI隐含DS段 (2)32位寻址的基址及变址寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP 其中EBP,ESP隐含SS段,其余隐含DS段 (3)ESP不能用于寻址方式(6),即(相对)比例变址寻址
存储器寻址完全格式:相对基址比例变址 段寄存器:[ 基址寄存器 + 比例因子 × 变址寄存器 + 位移量 ] 或:段寄存器:位移量[ 基址寄存器 + 比例因子 × 变址寄存器 ] 或:段寄存器:位移量[ 基址寄存器 ][ 比例因子 × 变址寄存器 ] 共演变出8种方式: (1)直接寻址(16/32寻址) (2)寄存器间接寻址(16/32寻址) (3)寄存器相对寻址(16/32寻址) (4)基址变址寻址(16/32寻址) (5)相对基址变址寻址(16/32寻址) (6)(相对)比例变址寻址(32寻址) (7)基址比例变址寻址(16/32寻址) (8)相对基址比例变址(16/32寻址) MOV AX,[DI+8];DS MOV AX,[BP+2];SS MOV AX,[ESI+10000H];DS MOV EAX,[ESP+10H];SS 说明(1)16位寻址的基址寄存器BX,BP;变址寄存器SI,DI 其中BP隐含SS段,BX,SI,DI隐含DS段 (2)32位寻址的基址及变址寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP 其中EBP,ESP隐含SS段,其余隐含DS段 (3)ESP不能用于寻址方式(6),即(相对)比例变址寻址
存储器寻址完全格式:相对基址比例变址 段寄存器:[ 基址寄存器 + 比例因子 × 变址寄存器 + 位移量 ] 或:段寄存器:位移量[ 基址寄存器 + 比例因子 × 变址寄存器 ] 或:段寄存器:位移量[ 基址寄存器 ][ 比例因子 × 变址寄存器 ] 共演变出8种方式: (1)直接寻址(16/32寻址) (2)寄存器间接寻址(16/32寻址) (3)寄存器相对寻址(16/32寻址) (4)基址变址寻址(16/32寻址) (5)相对基址变址寻址(16/32寻址) (6)(相对)比例变址寻址(32寻址) (7)基址比例变址寻址(16/32寻址) (8)相对基址比例变址(16/32寻址) MOV AX,[BX+SI];DS MOV AX,[BP+DI];SS mov eax,[edx][ebp];DS mov ax,[ebp][edx];SS 说明(1)16位寻址的基址寄存器BX,BP;变址寄存器SI,DI 其中BP隐含SS段,BX,SI,DI隐含DS段 (2)32位寻址的基址及变址寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP 其中EBP,ESP隐含SS段,其余隐含DS段 (3)ESP不能用于寻址方式(6),即(相对)比例变址寻址
存储器寻址完全格式:相对基址比例变址 段寄存器:[ 基址寄存器 + 比例因子 × 变址寄存器 + 位移量 ] 或:段寄存器:位移量[ 基址寄存器 + 比例因子 × 变址寄存器 ] 或:段寄存器:位移量[ 基址寄存器 ][ 比例因子 × 变址寄存器 ] 共演变出8种方式: (1)直接寻址(16/32寻址) (2)寄存器间接寻址(16/32寻址) (3)寄存器相对寻址(16/32寻址) (4)基址变址寻址(16/32寻址) (5)相对基址变址寻址(16/32寻址) (6)(相对)比例变址寻址(32寻址) (7)基址比例变址寻址(16/32寻址) (8)相对基址比例变址(16/32寻址) MOV AX,[BX+SI+10H];DS MOV AX,[EBP+EDI+6];SS 说明(1)16位寻址的基址寄存器BX,BP;变址寄存器SI,DI 其中BP隐含SS段,BX,SI,DI隐含DS段 (2)32位寻址的基址及变址寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP 其中EBP,ESP隐含SS段,其余隐含DS段 (3)ESP不能用于寻址方式(6),即(相对)比例变址寻址
存储器寻址完全格式:相对基址比例变址 段寄存器:[ 基址寄存器 + 比例因子 × 变址寄存器 + 位移量 ] 或:段寄存器:位移量[ 基址寄存器 + 比例因子 × 变址寄存器 ] 或:段寄存器:位移量[ 基址寄存器 ][ 比例因子 × 变址寄存器 ] 共演变出8种方式: (1)直接寻址(16/32寻址) (2)寄存器间接寻址(16/32寻址) (3)寄存器相对寻址(16/32寻址) (4)基址变址寻址(16/32寻址) (5)相对基址变址寻址(16/32寻址) (6)(相对)比例变址寻址(32寻址) (7)基址比例变址寻址(16/32寻址) (8)相对基址比例变址(16/32寻址) MOV AX, TAB[ESI*4];DS MOV EAX,4[EBP*4];SS 说明(1)16位寻址的基址寄存器BX,BP;变址寄存器SI,DI 其中BP隐含SS段,BX,SI,DI隐含DS段 (2)32位寻址的基址及变址寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP 其中EBP,ESP隐含SS段,其余隐含DS段 (3)ESP不能用于寻址方式(6),即(相对)比例变址寻址
存储器寻址完全格式:相对基址比例变址 段寄存器:[ 基址寄存器 + 比例因子 × 变址寄存器 + 位移量 ] 或:段寄存器:位移量[ 基址寄存器 + 比例因子 × 变址寄存器 ] 或:段寄存器:位移量[ 基址寄存器 ][ 比例因子 × 变址寄存器 ] 共演变出8种方式: (1)直接寻址(16/32寻址) (2)寄存器间接寻址(16/32寻址) (3)寄存器相对寻址(16/32寻址) (4)基址变址寻址(16/32寻址) (5)相对基址变址寻址(16/32寻址) (6)(相对)比例变址寻址(32寻址) (7)基址比例变址寻址(16/32寻址) (8)相对基址比例变址(16/32寻址) MOV AX,[BX+SI*1];DS MOV AX,[EBP+EDI*8];SS 说明(1)16位寻址的基址寄存器BX,BP;变址寄存器SI,DI 其中BP隐含SS段,BX,SI,DI隐含DS段 (2)32位寻址的基址及变址寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP 其中EBP,ESP隐含SS段,其余隐含DS段 (3)ESP不能用于寻址方式(6),即(相对)比例变址寻址
存储器寻址完全格式 :相对基址比例变址 段寄存器:[ 基址寄存器 + 比例因子 × 变址寄存器 + 位移量 ] 或:段寄存器:位移量[ 基址寄存器 + 比例因子 × 变址寄存器 ] 或:段寄存器:位移量[ 基址寄存器 ][ 比例因子 × 变址寄存器 ] 共演变出8种方式: (1)直接寻址(16/32寻址) (2)寄存器间接寻址(16/32寻址) (3)寄存器相对寻址(16/32寻址) (4)基址变址寻址(16/32寻址) (5)相对基址变址寻址(16/32寻址) (6)(相对)比例变址寻址(32寻址) (7)基址比例变址寻址(16/32寻址) (8)相对基址比例变址(16/32寻址) MOV AX,[BX+SI*1+40];DS MOV AX,[EBP+EDI*8+10];SS 说明(1)16位寻址的基址寄存器BX,BP;变址寄存器SI,DI 其中BP隐含SS段,BX,SI,DI隐含DS段 (2)32位寻址的基址及变址寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP 其中EBP,ESP隐含SS段,其余隐含DS段 (3)ESP不能用于寻址方式(6),即(相对)比例变址寻址
例:直接寻址 在这种方式下,指令中的操作数部分直接给出了操作数的有效地址EA,它和操作码一起放在存储器的代码段中,可以是16位或32位整数。但操作数一般在数据段DS中。 应注意的是,指令中的DS不能省略。 例:MOV AX,DS:[1000H] ;将DS段中1000H和1001H单元 的内容送到AX中。 问:DS=? 直接寻址示意图
二、转移地址寻址方式 在指令系统中,有一组指令为程序转移指令。程序转移指令的寻址方式涉及如何确定转移的目标地址。目标地址可以在段内,也可以在段外。
⑴段内直接寻址 转移的目标地址是当前IP寄存器的内容和一个8位或16位位移量之和。 指令的汇编语言格式表示为: JMP NEAR PTR PROGRAM JMP SHORT OUTSET ⑵ 段内间接寻址 该方式中,转移的目标地址是寄存器或存储单元的内容。寄存器或存储单元的内容可以用数据寻址方式中除立即数以外的任何一种寻址方式取得,所得到的内容将用来取代IP寄存器的值。 段内间接寻址转移指令的汇编格式可以表示为: JMP CX JMP WORD PTR [BX+TAB1]
⑶段间直接寻址 这种寻址方式用于段间转移,指令中直接提供了目标地址的段基址和偏移地址,所以,只要用指令中指定的偏移地址取代IP寄存器的内容,用指令中指定的段基址取代CS寄存器的内容就完成了从一个段到另一个段的转移操作, 指令的汇编语言格式可表示为: JMP FAR PTR NEXT ⑷ 段间间接寻址 该方式下,用存储器中两个相继字的内容来取代IP和CS寄存器中的原始内容,以达到段间转移的目的。这里,存储单元的地址是由指令指定除立即数方式和寄存器方式以外的任何一种数据寻址方式取得。 指令的汇编语言格式可表示为: JMP DWORD PTR [REL+BX]
第二节 80486微处理器指令系统 80X86的指令系统向上兼容,都是在8086指令的基础上发展形成的。与80286相比,增加了32位操作和访问存储器的32位寻址方式。 80486可以工作在实模式、保护模式和虚拟8086模式,为了支持系统工作模式,指令系统中设计了系统管理指令、保护模式控制指令以及高级语言支持指令等等。 80486的基本指令按功能可分为7类:数据传送指令、算术运算指令、逻辑运算指令、字符串操作指令、控制转移指令、处理器控制指令和按条件设置字节指令。下面分别给予介绍。
通用寄存器 EAX、EBX、ECX、EDX、EBP、ESP、SDI、ESI 存储器 立即数 段寄存器 CS、SS、DS、ES、FS、GS MOV指令允许的传送关系
临时课堂练习 写出下面各条指令执行后,各寄存器的十六进制值 Mov AL, -2 Mov AX,-2 Mov AL,254 Mov AX,254 Mov AL,0feh Mov AX,0feh
一 、数据传送指令 1)通用数据传送指令: 基本传送指令(MOV) 格式:MOV 目标操作数,源操作数 目标操作数和源操作数遵循传递关系 例如:MOV BYTE PTR [BX],55H ;55H送给BX间址的字节型单元 MOV [BX],55H ;0055H送给BX间址的字型单元 符号扩展传送指令MOVSX 格式:MOVSX 目标操作数,源操作数 目标操作数为16或32位通用寄存器,源操作数为位数低于目标操 作数的寄存器或存储器 例如:MOV DL,-16 ;DL = F0H MOVSX BX,DL ;BX = FFF0H,而DH,DL不变 零扩展传送指令MOVZX 格式:MOVZX 目标操作数,源操作数; 目标操作数和源操作数同MOVSX
例如:MOVZX EAX,CX ;将CX中16位数高位加0扩展为32位送入EAX MOVSX和MOVZX这两条指令常被用于作除法时对被除数位数的扩展。 交换指令XCHG 格式: XCHG 目标操作数,源操作数 reg reg mem reg reg mem 例:对临界资源访问, Semaphore 内存变量为指示灯,0表示可访问,非0不能访问 TEST:MOV AL,0FFH XCHG AL, Semaphore ;取标志并置标志 AND AL,AL JNZ TEST … ;访问临界资源 MOV AL,0 MOV Semaphore,AL
地址传送指令 ※LEA(Load Efficient Address)装有效地址 格式: LEA 目标操作数,源操作数 reg32 mem reg16 mem 例如:TABLE DB 31H,32H,33H,34H … LEA DI,TABLE 等效于 MOV DI,OFFSET TABLE ※指针传送指令 格式: LDS/LES/LFS/LGS/LSS 目标操作数,源操作数 reg(通用) mem 例如:设数据段有 XYZ1 DF 1234567890ABH XYZ2 DD 56781234H 如此时DS已指向数据段: LES EBX,XYZ1 ;ES=1234H,EBX=567890ABH LDS SI,XYZ2 ;DS=5678H,SI=1234H 注意:LEA装的是存储单元的偏移地址,LES等装的是存储单元的值
查表转换指令XLAT DS:[BX+AL]AL; DS:[EBX+AL] AL 例如:利用查表转换功能实现一位十六进制数 与ASCII码的转换。 DATA SEGMENT TAB DB ‘0123456789ABCDEF’ NUM DB 2 ;0~F中的任一数 DATA ENDS 代码段设置如下指令,可查出与NUM 单元中的数相对应的ASCII编码: MOV AX,DATA MOV DS,AX MOV BX,OFFSET TAB MOV AL,NUM XLAT ;
字节交换指令BSWAP 格式:BSWAP 32位寄存器 .31…24、23…16、15…8、7…0 7…0位与31…24位交换 23…16位与15…8位交换 .486特有 标志寄存器传送指令LAHF/SAHF 格式:LAHF 或 SAHF LAHF: EFLAGS(低字节)AH SAHF: AH EFLAGS(低字节)
2)堆栈指令 压栈指令PUSH 格式:PUSH 源操作数 ;imm16、imm32、mem16、mem32、reg16、reg32 弹栈指令POP 格式:POP 目标操作数 ;mem16、mem32、reg16、reg32 .SS:[ESP]为栈顶,并已经放有数 .根据操作数位数的不同,ESP一次调整到位 .向低地址方向生成 .ESP为操作数时,入栈的是未调整前的ESP值
16位标志寄存器压栈/弹栈指令PUSHF/POPF 格式:PUSHF POPF 32位标志寄存器压栈/弹栈指令PUSHFD/POPFD 格式:PUSHFD POPFD 全部16位通用寄存器压栈/弹栈指令PUSHA/POPA 格式:PUSHA POPA PUSH时顺序为AX、CX、DX、BX、SP、BP、SI、DI
全部32位通用寄存器压栈/弹栈指令PUSHAD/POPAD 格式:PUSHAD POPAD 3)I/O指令 I/O指令IN、OUT .IN OP1,OP2 OP2为口地址,由imm8(直接寻址)或DX(寄存器间接寻址)提供 OP1为寄存器AL、AX、EAX .OUT OP1,OP2 OP1为口地址,由imm8或DX提供 OP2为寄存器AL、AX、EAX
说明: ① 源操作数可以是8位、16位或32位的立即数、寄存器、段寄存器或存储器操作数,目标操作数是与源操作数等长的寄存器、段寄存器(CS除外)或存储器操作数。 ② 源操作数和目标操作数不能同时为存储器操作数。如:MOV [BP],[SI]是非法指令。 ③ 源操作数和目标操作数不能同在段寄存器中,如:MOV DS,ES是非法指令。
说明: ④ 立即数不能作为目标操作数。如:MOV 1234H,AX是非法指令。 ⑤ 不能将立即数直接传送到段寄存器,如:MOV SS,1000H 是非法指令。 ⑥ 当目标操作数为存储器操作数时,如源操作数是单字节的立即数,则应用PTR运算符说明目标操作数的属性,否则将被默认为字型操作数。
二 、算术运算指令 1)基本四则运算 加法指令ADD/带进位加法指令ADC 格式:ADD 目标操作数,源操作数 .目标操作数为寄存器或存储器,源操作数为寄存器、存储器或立即数 .不能同为存储器 ;目标操作数 = 源操作数 + 目标操作数 格式:ADC 目标操作数,源操作数;操作数要求同上 ;目标操作数 = 源操作数 + 目标操作数+CF 减法指令SUB /带借位减法指令SBB 格式:SUB 目标操作数,源操作数;操作数要求同上 ;目标操作数 =目标操作数-源操作数 格式:SBB 目标操作数,源操作数;操作数要求同上 ;目标操作数 =目标操作数-源操作数-CF
加1指令INC/减1指令DEC/求补指令NEG 格式:INC 目标操作数 ;目标操作数 = 目标操作数 + 1 DEC 目标操作数 ;目标操作数 = 目标操作数 – 1。 reg 或 mem 求补指令NEG(求相反数) 格式:NEG 目标操作数 ;目标操作数 = 0 – 目标操作数 reg 或 mem 交换加法指令XADD 格式:XADD 目标操作数,源操作数 reg reg mem reg ;将源操作数和目标操作数进行互换,然后将源操作数与目标操作数之和送给目标操作数。指令执行后的源操作数是指令执行前的目标操作数。(源操作数 存原来的目标操作数,目标操作数为和)
比较指令CMP 格式:CMP 目标操作数,源操作数 ;目标操作数 - 源操作数 .目标操作数为寄存器或存储器,源操作数为寄存器、存储器或立即数 .不能同为存储器 比较并交换指令CMPXCHG 格式: CMPXCHG 目标操作数,源操作数 reg reg mem reg ; 将目标操作数与累加器AL,AX或EAX比较,若相等则将源操作数传送到目标操作数,否则将目标操作数传送到累加器。
无符号数乘法指令MUL/带符号数乘法指令IMUL 格式:IMUL 源操作数 ; AX /EAX ←AL/AX×源操作数 reg / mem IMUL 目标操作数,源操作数 reg reg reg mem reg imm ;目标操作数←目标操作数×源操作数 IMUL 目标操作数,源操作数,立即数 reg reg imm reg mem imm ;目标操作数←源操作数×立即数 ;在三操作数格式下,目标操作数只能是16或32位的通用寄存器,源操作数是与目标操作数等长的寄存器操作数或内存操作数,立即数也与它们等长。8位立即数能自动进行符号扩展,转换成16或32位的立即数。
无符号数除法DIV/带符号数除法IDIV 格式:DIV 源操作数 ; AX(16位)/DX:AX (32位) /EDX:EAX (64位) ÷源操作数 ;商:AL/AX/EAX 余数:AH/DX/EDX IDIV 源操作数 ;被除数和除数都是带符号数, ;被除数和余数的符号相同。 源操作数为寄存器操作数或内存操作数 说明:若除数为0或商过大(超过保存商的累加器容量)时,产 生0号中断 mov bl,1 mov al,0ffh imul bl; ax=? mov bl,1 mov al,0ffh mul bl; ax=? ffff 00ff
mov ax,17 mov bl,-3 idiv bl; ax=? mov ax,17 mov bl,-3 div bl; ax=? 1100h 02fbh 符号位扩展(数据宽度变换)指令CBW,CWD,CWDE,CDQ 格式:CBW/CWD/CWDE/CDQ 说明:① CBW将AL中的8位带符号数带符号扩展为16位→AX中。 ② CWD将AX中的16位带符号数带符号扩展为32位→DX:AX中。 ③ CWDE将AX中的16位带符号数带符号扩展为32位→EAX中。 ④ CDQ将EAX中的32位带符号数带符号扩展为64位→EDX:EAX中。
2)十进制调整指令 格式:DAA ;组合BCD码数的加法调整指令 DAS;组合BCD码数的减法调整指令 AAA;分离BCD码数的加法调整指令 AAS;分离BCD码数的减法调整指令 AAM ;分离BCD码数的乘法调整指令 AAD;分离BCD码数的除法调整指令
为什么要进行十进制调整? 希望符合人们的常规思维习惯.而计算机本身只能进行十六(二)进制运算 对比:79+46=? 程序实现: Mov al,79; AL=4fh Mov bl,46; bl=2eh Add al,bl; al=7dh (1)常规算法: 79+46->4fh+2eh->7dh Mov al,79H Mov bl,46H Add al,bl; al=bfh DAA; AL=25h (BCD) (2)BCD方法: 79BCD+46BCD->bfH->调整->25BCD CF=1表示100
AAD放在DIV之前,用于将AX中未组合BCD码调整为二进制数,使除法得到的商和余数为有效的未组合BCD码(实验结果商为二进制数,见后面的例子)AAD放在DIV之前,用于将AX中未组合BCD码调整为二进制数,使除法得到的商和余数为有效的未组合BCD码(实验结果商为二进制数,见后面的例子) DAA、DAS、AAA、AAS、 AAM放在相应指令之后 MOV AL,08H ADD AL,09H; AL = 11H DAA 结果: AL = 17D 两个4位组合BCD码(比如3579+2468)相加 MOV AL,BCD1; AL = 79h ADD AL,BCD2; AL = E1h DAA; AL = 47h CF=1 MOV BCD3,AL ;(BCD3)=47h MOV AL,BCD1+1 ;AL = 35h ADC AL,BCD2+1 ; AL = 5ah(35h+24h+1) DAA ;AL = 60h MOV BCD3+1,AL ;(BCD3+1)=60h
mov ax,0507h mov bx,0108h add ax,bx ;ax=060fh aaa ;ax=0705h mov ax,0507h add ax,18h ;ax=051f aaa ;ax=0605
两个ASCII码相减 MOV AL,’5’ SUB AL,’7’ ; AL = FEh AAS ; AL=08H,CF=1 mov ax,0205h sub ax,07h ;ax=1fe aas ;ax=8 mov ax,0205h sub ax,0107h ;ax=fe aas ;ax=ff08 只考虑AL的结果
非组合BCD码的乘法(6*8) MOV AL,06H MOV BL,08H MUL BL ; AX: AL*BL=30H AAM ; AX = 0408H mov al,05h ; mov bl,08h ; mul bl ;ax 28h aam ;ax 0400h 两个非组合BCD码除法(17/5=3……2) MOV AX, 0107h MOV BL,5 AAD ;放在除法前 AX=11h DIV BL ;AL:03,AH:02 mov ax,0507h mov bl,05h aad ;ax 39h div bl ;ax 020bh 商是二进制数,不是BCD码
比较及减法指令对标志位影响讨论 CMP op1,op2 1.相等:ZF=1,CF、OF、SF为0 2.不等:ZF=0; 看成无符号数,op1<op2,CF置1 否则CF为0 相减后,最高位为1,SF为1 否则,SF为0 看成有符号数,若op1-op2超出有符号数表示范围,OF为1,否则,OF为0
讨论:比较(减法指令)标志影响分析 CF ZF SF OF 3,5(03,05) 1 0 1 0 5,3(05,03) 0 0 0 0 3,-2(03,fe) 1 0 0 0 3,-128(03,80) 1 0 1 1 -2,3(fe,03) 0 0 1 0 -2,127(fe,7f) 0 0 0 1 -1,-2(ff,fe) 0 0 0 0 -2,-1(fe,ff) 1 0 1 0
加法运算对标志位的影响 将 op1,op2的二进制码相加(负数用补码): 1.结果为0(忽略进位):ZF=1,否则ZF为0 2.相加后最高位向前有进位,CF置1, 否则CF为0 3.相加后最高位为1,SF为1,否则SF为0 4.相加后最高位和次高位之一有进位,OF为1,否则OF为0.实际上就是op1+op2超出有符号数表示范围,即正数加正数得到了负数,或负数加负数得到了正数。
讨论:加法指令标志影响分析 CF 次高位 ZF SF OF 1,1(01,01) 0 0 0 0 0 1,127(01,7f) 0 1 0 1 1 2,-1(02,ff) 1 1 0 0 0 1,-2(01,fe) 00 0 1 0 -1,-1(ff,ff) 1 1 0 1 0 -1,-128(ff,80) 1 0 0 0 1 -1,1(ff,1) 1 1 1 0 0