第三章 80 x86的指令系统和寻址方式 3.1 指令概述 3.2 80x86的寻址方式 ( ※ ) 3.3 程序占有的空间和执行的时间
3.1 指令概述 3.1.1 指令的格式 3.1.2 指令的种类(按操作数个数分) 一地址指令 二地址指令 三地址指令 3.1.3 操作数的种类(按操作数的来源分)
3.1.3 操作数的种类 (1) 立即操作数: 指令要操作的数据在指令代码中, MOV AL,10H ;指令码B010. (2) 存储器操作数:指令要操作的数据在存储器(内存)中, MOV AL,[1234H]; 指令码A03412. (3)寄存器操作数:指令要操作的数据在CPU的寄存器中, MOV AL,BL; 指令码88D8. (4)I/O端口操作数, IN AL,20H; 指令码E420.
3.2 80x86的寻址方式 3.2.1 与数据有关的寻址方式 3.2.2 与转移地址有关的寻址方式
3.2.1 与数据有关的寻址方式 用来确定操作数的地址从而找到操作数。 寻址方式的分类: 1. 立即寻址 2. 寄存器寻址 3. 存储器寻址 1. 立即寻址 2. 寄存器寻址 3. 存储器寻址 4. 固定寻址(补充)
1.立即寻址 指令要操作的数据包含在指令码中. 例: MOV AX,1234H 其指令码为B83412,指令执行后 (AX) =1234H MOV AL ,05H (AL)=? MOV EAX,12345678H (EAX)=?
2.寄存器寻址 在指令中给出的寄存器的名字(编号), 要操作的数据在该寄存中. 例:MOV AX, 1234H; MOV BX, AX ; 第二条指令执行后(BX)=(AX)= 1234H MOV DX, BX (BX)= ? (DX)= ?
3. 存储器寻址 有效地址 存储器寻址方式的种类 存储器寻址方式中段的相关说明
有效地址 在存储器寻址方式中, 要寻址的数据位于存储器(内存)中, 在指令中是直接或间接的给出的存储器操作数的地址. 有效地址(EA):操作数的偏移地址 有效地址的组成: 1.位移量:存放在指令中的一个8位、16位、或者32位的数 2.基址:存放在基址寄存器中的内容,通常指向数据段中数组或字符串的首地址 3.变址:存放在变址寄存器中的内容,通常用来访问数组中的某个元素或者字符串中的字符 4.比例因子:通常是内存中存储数据的字节数,一般值为1,2,4,8 有效地址的计算公式: EA=基址+(变址*比例因子)+位移量
3. 存储器寻址相关寻址方式 存储器寻址包括: (1)直接寻址 (2)寄存器间接寻址 (3)寄存器相对寻址 (4)基址变址寻址 (1)直接寻址 (2)寄存器间接寻址 (3)寄存器相对寻址 (4)基址变址寻址 (5)相对基址变址寻址 (6)比例变址寻址 (7) 基址比例变址寻址 (8)相对基址比例变址寻址 注意 80x86中为了使指令字不会过长,规定双操作数指令的两个操作数中,只能有一个使用存储器方式,所以一个变量常常先送到寄存器。
(1)直接寻址方式 在存储器直接寻址中, 指令直接给出的是操作数在内存中存放的地址.有效地址只包含位移量一种成分. 例:MOV AL,[2000H]; MOV BX,[2000H]; 其中(DS)=3000H 执行结果各是多少? MOV BX,[VALUE]; MOV EAX,DATA;
(2)寄存器间接寻址 在寄存器间接寻址中, 操作数位于内存中, 操作数的偏移地址位于某个寄存器中, 在指令中给出的是该寄存器的名字(编号). 一般用于表格处理。 例: MOV AL,[BX]; MOV AX,[SI]; 假定 (DS)=3000H (BX)=2000H; (SI)=2002H; 则: (AL)=34H, (AX)=5323H 如果(EDX)=2000H 则执行MOV ECX,[EDX]后 (ECX)=?
(2)寄存器间接寻址 可以用于寄存器间接寻址的寄存器有: 16位寻址:BX->[BX], BP->[BP], SI->[SI], DI->[DI] 32位寻址:除ESP之外的所有32位通用寄存器
(3)寄存器相对寻址 在寄存器相对寻址中, 操作数位于位于内存中, 操作数的地址由基址或变址寄存器BX、BP或者SI、DI与一个位移量相加给出。 例: MOV AL,[BX+1002H]; MOV CX, SI[1000H]; 假定 (BX)=1000H (SI)=1002H 则结果是多少?
(3)寄存器相对寻址 寄存器相对寻址的格式: [BX+位移量] [BP+位移量] [SI+位移量] [DI+位移量] 位移量的范围: 补码表示的16位 (-32768~+32767)
(4)基址变址寻址 在基址变址寻址中, 操作数位于位于内存中, 操作数的地址由基址寄存器BX或BP与变址寄存器SI或DI相加给出。 例: MOV AL,[BX+SI] ; MOV AX,[BX][SI] ; 假定:(BX)=1000H (SI)=1002H 则: 结果, (AL)=23H (AX)=?
(4)基址变址寻址 基址变址寻址的格式: [BX+SI] [BX+DI] [BP+SI] [BP+DI] 错误的写法: [BX+BP] [SI+DI] 位移量的范围: 补码表示的16位 (-32768~+32767) 适用情况 数组或者表格处理,首地址可存放在基址寄存器中,用变址寄存器来访问数组或表格中的各个元素
(5)相对基址变址寻址 在基址变址寻址中, 操作数位于位于内存中, 操作数的地址由基址寄存器BX或BP与变址寄存器SI或DI及一个位移量相加给出。 例: MOV AL,[BX+SI+0103H] ; 假定:BX=1000H,SI=0F00H 则: 结果, AL=53H MOV AX,[BX+SI+0103H] 结果是多少?
(5)相对基址变址寻址 相对基址变址寻址的格式: [BX+SI+位移量] [BX+DI+位移量] [BP+SI+位移量] [BP+DI+位移量] 位移量的范围: 补码表示的16位 (-32768~+32767) 适用情况 主要用于二维数组的寻址或者堆栈中数据的处理。
(6)比例变址寻址 操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子,再加上位移量之和。 例: MOV EAX,COUNT[ESI*4]
(7) 基址比例变址寻址(了解) 操作数的有效地址是基址寄存器的内容乘以指令中指定的比例因子,再加上位移量之和。 例:MOV ECX,[EAX][EDX*8]
(8)相对基址比例变址寻址(了解) 操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子,加上基址寄存器的内容,再加上位移量之和。 例: MOV EAX,TABLE[EBP][EDI*4]
存储器寻址方式中段的相关说明 在存储器寻址方式中只给出了偏移地址, 其段地址是隐含的, 一般情况下, 是DS, 只有特殊情况下是SS. 特殊情况: 在基址寻址和基址变址寻址方式下, 基址寄存器是BP. 请看下面的例子:
存储器寻址方式中段的相关说明 MOV AX,[BX+100H] 假定 DS=1000H, SS=2000H, BP=0100H, BX=0100H, 如下指令在执行完后的结果分别是什么? MOV AX,[BX+100H] MOV AX,[BP+100H]
存储器寻址方式中段的相关说明 段更换 当要操作的数据不在隐含段中时, 就需要段更换或段跨越.要寻址的数据在2000H段的0100H单元,而目前没有一个段寄存器的值是2000H, 就需要将2000H装入某个段寄存器,如DS,这就是段更换. MOV AX,2000H MOV DS,AX MOV BX,0100H MOV AL,[BX]
存储器寻址方式中段的相关说明 段跨越 当要操作的数据不在隐含段中时, 就需要段更换或段跨越.要寻址的数据在2000H段的0100H单元,而目前ES段寄存的值是2000H,可在寻址操作数加一段跨越前缀,如ES,这就是段跨越. MOV BX,0100H MOV AL,ES:[BX]
4. 固定寻址 指令要操作的数据在指令中并没有明确给出,但隐含在指令中. 例: MUL BL ; AL*BL=>AX 在该指令中, AL和AX并未给出.
3.2.2 与转移地址有关的寻址方式 段内直接寻址 段内间接寻址 段间直接寻址
3.3 程序占有的空间和执行的时间 指令的执行时间 取指令、取操作数、执行指令以及传送结果所需时间的总和 指令的基本执行时间因指令的不同而不同,相互之间的差别很大,而存取操作数的时间又因为不同的寻址方式而不同。
3.3 程序占有的空间和执行的时间 有效地址的计算时间(时钟周期数) 表中所列的计算时间是指令寻址隐含段存储器操作数所花费的时钟周期数,若有段跨越前缀时,寻址的时间还要增加2个时钟周期。
3.4 指令系统 80x86的指令系统可以分为以下6组 3.4.1 数据传送指令 3.4.2 算术运算 3.4.3 逻辑运算 3.4.1 数据传送指令 3.4.2 算术运算 3.4.3 逻辑运算 3.4.4 串处理指令 3.4.5 控制转移指令 3.4.6 处理机控制指令
3.4.1数据传送指令 1. 通用数据传送指令 2. 累加器专用传送指令 3. 地址传送指令 4. 标志寄存器传送指令 5. 类型转换指令
1.通用数据传送指令 (1) MOV 传送 (2) PUSH 进栈 (3) POP 出栈 (4) XCHG 交换
(1) MOV指令 指令汇编格式: MOV dest,src 操作: 将一个源操作数src (字节或字) 传送到目标操作数dest中。
(1) MOV指令 MOV mem/reg1 ,mem/reg2 MOV reg , data MOV ac, mem MOV mem, ac MOV segreg,mem/reg MOV mem/reg, segreg MOV mem/reg, data 其中mem代表存储单元;reg代表寄存器, data代表立即数; ac代表累加器,一般指AL或者AX;segreg代表段寄存器
(1) MOV指令 注意 1.指令中dest和src不能同时为存储器操作数;CS不能做为目标操作数使用;段寄存器之间不能互相传送;立即数不能送入段寄存器。 2. MOV指令不影响标志位。
(1) MOV指令 MOV ALPHA_W,AX MOV BETA_B,AL MOV AL,ES:[BX+SI+1000H] MOV AX,2000H MOV DS,AX MOV BX,1000H MOV CX,[BX] MOV [BX+10],AL MOV [BX],10H MOV DS,10H MOV CS,AX MOV [BX], [1000H]
(2) PUSH指令 指令汇编格式: PUSH src 操作:堆栈指示器减 2 SP←SP-2 将给定的操作数存放到由SP指出的栈顶中。 (SP+1,SP)←(src) 受影响的状态标志位: 没有 说明: PUSH指令的目标地址一定在当前堆栈中。SS内容为段基址,偏移量由堆栈指针SP指出。操作数一定是16位的寄存器或存储器操作数。
(2) PUSH 指令 假定(AX)=1234H,(BX)=5678H,SS=2000H,SP=0100H,则执行下列指令后堆栈的状态是: PUSH BX
(3) POP指令 指令汇编格式: POP dest 操作:(1)将堆栈栈顶中存放的字传送到操作数中。 dest←(SP+1,SP) (2) 堆栈指针加2 SP←SP+2 受影响的状态标志位: 没有 说明:目标操作数只能是16位的存储器或寄存器操作数(CS除外)。
(3) POP 指令 假定在执行指令 POP CX POP DX 之前,堆栈的状态如图所示。指令执行后CX,DX的内容及堆栈的状态?
(3) POP 指令 PUSH SI PUSH DI POP DS POP ES 假定SI=1234H, DI=5678H, 则执行下列指令后 DS,ES的内容是? PUSH SI PUSH DI POP DS POP ES
(4) XCHG 交换 指令汇编格式: XCHG dest,src 操作: dest的内容与src的内容互换。 (dest)←→(src) 受影响的状态标志位: 没有 说明: dest和src不能同时为存储器操作数。段寄存器、立即数不能作为操作数。
(4) XCHG指令举例 XCHG AL,BL XCHG CL,[BX] XCHG BL,[BX+SI+10] XCHG AX,AX XCHG AL,SI XCHG [SI],[BX+10] XCHG DX,DS XCHG AL,10
2. 累加器专用传送指令 (1) IN 输入 (2) OUT 输出 (3) XLAT 换码
(1) IN 输入指令 指令汇编格式: 长格式:IN acc, port 操作:(acc)←(port) 短格式:IN acc, DX 将指定端口的内容(字或字节)传送到累加器AX或AL中。 受影响的标志位:无 说明:如果端口号在0到255之间,那么端口号直接在指令中指定,如果端口号大于255,那么端口号要必须先放到DX寄存器中,然后再传送。
(1) IN 输入指令 例: IN AL, 12H ;把12H号端口的信息输入到AL寄存器 IN AX, 28H; MOV DATA_WORD, AX ;把28H,和29H端口的信息输入到DATA_WORD ;(28H) DATA_WORD, (29H) DATA_WORD+1 MOV DX, 3FCH IN AX, DX ;把3FCH和3FDH端口号的内容输入到AX寄存器中 IN AL, DX IN AX,0FF10H MOV DX,0FF10H IN AX,OFF10H
(2) OUT 输出指令 指令汇编格式: 长格式:OUT port ,acc 操作: (port) ← (acc) 长格式:OUT DX ,acc 操作: (DX) ← (acc) 将累加器AX或AL的内容传送到指定端口。 受影响的标志位:无 说明:如果端口号在0到255之间,那么端口号直接在指令中指定,如果端口号大于255,那么端口号要必须先放到DX寄存器中,然后再传送。
(2) OUT 输出指令 例: OUT 5, AL;把AL寄存器的内容输出到5号端口 OUT 28H,AX ;把AX寄存器的内容输出到28H、29H号端口 MOV DX, 3FCH OUT DX, AX ;把AX寄存器的内容输出到3FCH、3FDH号端口 OUT DX, AL ;把AX寄存器的内容输出到3FCH号端口 OUT 0359H,AX MOV DX,0359H OUT DX,AX
(3) XLAT换码指令 指令汇编格式: XLAT 操作:BX和AL内容之和指出的内存字节单元的内容送到AL中。 AL←(BX)+(AL) 受影响的状态标志位: 没有 说明: XLAT指令用于查表。表的开始地址即表头地址由BX寄存器给出。AL中的原始值是要寻址的表中元素地址的位移量,规定表中第一个字节的位移量为0。这是一种特殊的基址变址寻址方式,基址寄存器为BX,变址寄存器为AL。
(3) XLAT换码指令 应用举例 看如下的一种加密方式(替代加密): A B C D E F G H I J K L M N O P Q Y Z D M R N H X J L I O Q U W A C R S T U V W X Y Z B E G F K P T S V 明文:THIS IS A COMPUTER 密文:GXJE JE Y DWQAFGRB
(3) XLAT换码指令 JMTAB DB ’YZDMRNHXJLIOQ’ DB ’UWACBEGFKPTSV’ MOV AX,SEG JMTAB MOV DS,AX MOV BX,OFFSET JMTAB MOV AL,’T’ SUB AL,’A’ MOV AH,0 ADD BX,AX MOV AL,[BX]
(3) XLAT换码指令 JMTAB DB ’YZDMRNHXJLIOQ’ DB ’UWACBEGFKPTSV’ MOV AX,SEG JMTAB MOV DS,AX MOV BX,OFFSET JMTAB MOV AL,’T’ SUB AL,’A’ XLAT
3. 地址传送指令 (1) LEA 有效地址送寄存器 (2) LDS 指针送寄存器和DS (3) LES 指针送寄存器和ES
(1) LEA指令 指令汇编格式: LEA dest,src 操作: 将指令中给出的存储器操作数的有效地址(即地址的偏移量)送到指定的寄存器中。 dest←EA 受影响的状态标志位: 没有 说明: LEA指令是将源操作数地址的偏移量,即有效地址传送到目标操作数中。源操作数必须是一个存储器操作数,标操作数可以是任一16位通用寄存器、指针寄存器或变址寄存器。
(1) LEA指令 DATA1 DB 10H MOV BX, DATA1 LEA BX,DATA1 MOV BX,OFFSET DATA1 MOV BX,1000H MOV SI, 1000H LEA AX,[BX+1000H] MOV AX,[BX+1000H] LEA DX,[BX+SI+02H] MOV DX,[BX+SI+02H] 假设:(DS)=3000H
(1) LEA指令 指令汇编格式: LDS dest,src 操作: (1)将双字长存储器操作数中的低地址字传送到指定的寄存器中。 dest←(EA) (2)将双字长存储器操作数中的高地址字传送到DS寄存器中。 DS←(EA+2) 受影响的状态标志位: 没有 说明: LDS是将src指出的连续两个字的内容,即一个32位的指针变量传送到一对16位的目标寄存器中。高位字为段基地址,LDS指令将其传送到数据段寄存器DS中,低位字为偏移量,传送到由dest指出的一个通用寄存器,指针寄存器或变址寄存器中,但不能是段寄存器。
(2) LDS指令 指令汇编格式: LDS dest,src 操作: (1)将双字长存储器操作数中的低地址字传送到指定的寄存器中。dest←(EA) (2)将双字长存储器操作数中的高地址字传送到DS寄存器中。 DS←(EA+2) 受影响的状态标志位: 没有 说明: LDS是将src指出的连续两个字的内容,即一个32位的指针变量传送到一对16位的目标寄存器中。高位字为段基地址,LDS指令将其传送到数据段寄存器DS中,低位字为偏移量,传送到由dest指出的一个通用寄存器,指针寄存器或变址寄存器中,但不能是段寄存器。
(2) LDS指令 MOV DI, 1000H LDS BX,[SI+1000H] 假设:指令执行前 (DS)=3000H,
(3) LES 指令 指令汇编格式: LES dest,src 操作:(1)将双字长存储器操作数中的低地址字传送到指定的寄存器中。 dest←(EA) (2)将双字长存储器操作数中的高地址字传送到ES寄存器中。 ES←(EA+2) 受影响的状态标志位: 没有 说明: LDS是将src指出的连续两个字的内容,即一个32位的指针变量传送到一对16位的目标寄存器中。高位字为段基地址,LDS指令将其传送到附加段寄存器ES中,低位字为偏移量,传送到由dest指出的一个通用寄存器,指针寄存器或变址寄存器中,但不能是段寄存器
(3) LES指令 MOV SI, 1000H LES BX,[SI+1000H] 假设:(DS)=3000H 执行完上述指令后,ES和
4. 标志寄存器传送指令 (1) LAHF 标志送AH (2) SAHF AH送标志寄存器 (3) PUSHF 标志进栈 (4) POPF 标志出栈
(1) LAHF 标志送AH指令 指令汇编格式: LAHF 操作:标志寄存器低8 位的状态标志填写在AH寄存器相应位中。 AH←SF:ZF:×:AF:×:PF:×:CF 受影响的状态标志位: 没有 说明: 此指令在80x86中几乎无用,主要是为了保证与8080/8085向下兼容,才保留了该指令.
(2) SAHF AH送标志寄存器指令 指令汇编格式: SAHF 操作: 将AH寄存器中的相应位传送到状态标志寄存器相应位中。 SF:ZF:×:AF:×:PF:×:CF←AH 受影响的状态标志位: SF,ZF,AF,PF,CF 说明: 此指令在80x86中几乎无用,主要是为了保证与8080/8085向下兼容,才保留了该指令.
(3) PUSHF 标志进栈 指令汇编格式: PUSHF 操作: 将堆栈指针减2,然后将标志寄存器F中的值存储到栈顶字的对应位中; SP←SP-2 (SP+1,SP)←F 受影响的状态标志位: 没有
(4) POPF 标志出栈 指令汇编格式: POPF 操作:将位于堆栈栈顶字中的对应位写入标志寄存器F中,然后将堆栈指针加2 。 F←(SP+1,SP) SP←SP+2 受影响的状态标志位: 所有标志位
5.类型转换指令 (1) CBW 字节转换为字 格式:CBW 执行的操作:AL的内容符号扩展到AX,形成AX中的字。 (2) CWD 字转换为字节 格式:CWD 执行的操作:AX的内容符号扩展到DX,形成DX:AX中的双字。
3.4.2算术指令 1. 加法运算指令 2. 减法运算指令 3. 乘法运算指令 4. 除法运算指令
1. 加法指令 (1) ADD (addition)加法 (2) ADC( addition with carry)带进位加 (3) INC( increment by 1)加1
(1) ADD (addition)加法 指令汇编格式: ADD dest,src 操作: 两个操作数求和,结果存目标操作数中。 dest←(dest)+(src) 受影响的状态标志位: OF,SF,ZF,AF,PF,CF 说明: dest和src不能同时为存储器操作数和段寄存器。 例: ADD AL,3 ADD CX,MEM_W ADD GAMA[BP][DI],BL ADD [BP+DI+OFFSET GAMA],BL
(2) ADC带进位加 指令汇编格式: ADC dest,src 操作: 两个操作数相加的同时,再加上CF。结果存入目标操作数中。 dest←(dest)+(src)+CF 受影响的状态标志位: OF,SF,ZF,AF,PF,CF 说明:ADC指令主要用于多精度数据相加。 例: ADC AL,3 ADC DX,[BX+10]
(2) ADC带进位加 3字节数据相减: 123456H+789ABCH=8ACF12H MOV AL,56H MOV AH,34H MOV BL,12H ADD AL,0BCH ADC AH,9AH ADC BL,78H 00010010 00110100 01010110 01111000 10011010 10111100 10001010 11001111 00010010 ADC ADC ADD +
(3) INC(increment by 1)加1 指令汇编格式: INC dest 操作:将指定的操作数加1,并将结果回送到目标操作数中。 dest←(dest)+1 受影响的状态标志位: OF,SF,ZF,AF,PF 说明:INC 指令不影响CF。 例: INC AL INC BX INC DATA1 INC [BX]
2. 减法指令 (1) SUB (subtract)减法 (2) SBB(subtract with borrow)带借位加 (3) DEC(decrement by 1)减1 (4) NEG(negate)取补 (5) CMP(compare)比较
(1)SUB (subtract) 减法 指令汇编格式: SUB dest,src 操作: 从目标操作数减去源操作数,结果存入目标操作数中。 dest←(dest)-(src) 受影响的状态标志位: OF,SF,ZF,AF,PF,CF 例: SUB AL,10H SUB AL,[BX+10H] SUB AL,AL
(2) SBB带借位加 指令汇编格式: SBB dest,src 操作:从目标操作数中减去源操作数和CF,结果存入目标操作数中。 dest←(dest)-(src)-CF 受影响的状态标志位:OF,SF,ZF,AF,PF,CF 说明: SBB 指令主要用于多精度数据减法。 例: SBB AL,0 SBB DL,CL
(3) DEC(decrement by 1)减1 指令汇编格式: DEC dest 操作:将指定的操作数减1,并将结果送回到目标操作数中。 dest←(dest)-1 受影响的状态标志位:OF,SF,ZF,AF,PF 说明: DEC指令不影响CF。 例: DEC BX DEC BYTE PTR [BX+SI+1000H] DEC SP
指令汇编格式: NEG dest 操作:从0中减去指令中给定的操作数,最后将结果送回到给定的操作数中。 dest←0-(dest) 受影响的状态标志位: OF,SF,ZF,AF,PF,CF 说明: NEG 指令对于带符号的数来说是取负,即改变操作数的符号. 例: NEG AX NEG BYTE PTR [BX+10]
指令汇编格式: CMP dest,src 操作: 从目标操作数中减去源操作数 (dest)-(src) 受影响的状态标志位:OF,SF,ZF,AF,PF,CF 说明: CMP 将两个操作数相减,两个操作数保持原值不变,但与SUB指令一样影响标志。 例: CMP AL,BL CMP DL,10H
3. 乘法指令 乘法指令共有两条,分别对应无符号整数的乘法和带符号整数的乘法. 1. MUL (multiply,unsigned) 无符号乘法 2. IMUL (integer multiply,signed) 带符号乘法
MUL (multiply,unsigned) 无符号乘法 指令汇编格式: MUL src 操作: 源操作数与累加器的内容相乘。如果源操作数是字节数据,就与AL中的数据相乘,乘积为字,存放在AX中。如果源操作数是字数据,就与AX中的数相乘,乘积为双字,存放在DX和AX中。 两个字节数相乘: AX←AL*(src) 两个字数据相乘: DX,AX←AX*(src) 受影响的状态标志位: OF,CF 说明: 源操作数src不能是立即数。如果乘积的高半 部 不为零时,CF和OF被置位,否则将被清除
例: MUL BL MUL DX MUL BYTE PTR [SI+BX+1000H] AL src AX × AX × src AX DX
指令汇编格式: IMUL src 操作: 将源操作数与累加器的内容相乘。如果源操作数是字节数据,就与AL中的数相乘,乘积为字,存放在AX中。如果源操作数是字数据,那么就与AX数相乘,乘积为双字,存放在DX和AX中。 两个字节数相乘: AX←AL*(src) 两个字数据相乘: DX,AX←AX*(src) 受影响的状态标志位: OF,CF。 说明: src不能是立即数。IMUL指令视操作数为带符号的数。如果乘积的高半部不是符号位的扩展时,CF和OF被置位,否则将被清除。
4.除法指令 1. DIV (division,unsigned) 无符号除法 2. IDIV (division,signed) 带符号除法 3. CBW (convert byte to word)将字节转换为字 4. CWD (convert word to double word)将字转换为双字
DIV (division,unsigned) 无符号除法 指令汇编格式: DIV src 操作: AX(或DX,AX)的内容除以src的内容。商存放在AL(字节时)或AX(字时),并将余数存放在AH(字节时)或DX(字时) 中。 字除以字节: AX/(src);AL←商,AH←余数 双字除以字: DX,AX/(src);AX←商,DX←余数 受影响的状态标志位: 不产生有效的状态标志。 说明: src不能是立即数; 如果商数超过了允许的最大值 (字节时为0FFH,字时为0FFFFH) 时就产生一个方式0 的中断,并且商和余数都不确定。
AX 8位除数 AL(商) AH(余) DX:AX 16位除 AX(商) DX(余)
DIV BL DIV WORD PTR [BX+DI+1000H] MOV AX,1000H MOV CL,08H DIV CL
IDIV ( division,signed) 带符号除法 指令汇编格式: IDIV src 操作: AX(或DX,AX)的内容除以src的内容。商存放在AL( 字节时) 或AX (字时),并将余数存放在AH (字节时) 或DX (字时) 中。 字除以字节: AX/(src) ;AL←商,AH←余数 双字除以字: DX,AX/(src);AX←商,DX←余数 受影响的状态标志位: 不产生有效的状态标志。 说明: src不能是立即数; 如果商数超过了允许的最大值 (字节时为-128~127,字时为-32768~32767)时就产生一个方式0的中断,并且商和余数都不确定。
乘除法指令的应用扩充 乘法指令能实现: BYTE*BYTE=WORD WORD*WORD=DORD 除法指令能实现: WORD/BYTE=BYTE DWORD/WORD=WORD 如何实现: WORD*BYTE BYTE /BYTE WORD/WORD WORD WORD DWORD
符号: 字节转换为字(AL→AX): MOV AH,0 字转换为双字(AX→DX:AX): MOV DX,0 带符号: 字节转换为字(AL→AX)正数: MOV AH,0 负数: MOV AH,0FFH 字转换为双字(AX→DX:AX) 正数:MOV DX,0 负数:MOV DX,0FFFFH
指令汇编格式: CBW 操作:将AL中第7位的值扩展到整个AH中。 如果AL为正,那么AH←00H 否则 AH←0FFH 受影响的状态标志位: 没有 说明: CBW 是将AL寄存器中数的符号位扩展到整个AH寄存器中。
指令汇编格式: CWD 操作: 将AX中的最高位扩展到整个DX中。 如果 AX 为正,那么 DX ←0000H 否则 DX ←0FFFFH 受影响的状态标志位: 没有 说明: CWD将寄存器AX的符号位扩展到整个寄存器DX中。