1.除法指令
1)无符号除法指令
DIV OPRD
若OPRD是字节数,则执行AX/OPRD AL=商 AH=余数
若OPRD是双字节(字)数,则执行 DXAX/OPRD AX=商 DX=余数
指令要求被除数是除数的双倍字长
对6个标志位均无影响
2.BCD码(十进制)运算调整指令
共6条,均为隐含寻址方式,隐含的操作数是 AL或AL、AH;
不能单独使用,要紧跟在相应的算术运算指令 之后(加法、减法、除法)或之前(乘法);
执行结果为压缩BCD码或扩展BCD码表示的十进制数。
(1)压缩BCD码加法的十进制调整指令DAA
MOV AL,48H
ADD AL,27H
DAA
(AL)=75H,AF=1,CF=0
DAA指令影响CF、SF、PF、AF、ZF 不影响OF
(2)非压缩BCD码加法的十进制调整指令AAA
若(AL)中低4位 >9 或 AF=1 则(AL)+6 →(AL),(AH)+1, 并使AF=1
屏蔽掉(AL)中高4位, 即(AL)←(AL)∧0FH,CF ←AF
MOV AL,09H ;BCD数9
MOV BL,04H;BCD数4
ADD AL,BL
;(AL)=09H+04H=0DH
AAA
;(AL)=0DH+06H=03H
; (高4位清0)
;(AH)=1;(CF)=1
AAA指令只影响AF和CF标志
(3)非压缩BCD码减法的十进制调整指令DAS
若(AL)中低4位 >9 或 AF=1
则(AL)— 06H →(AL),并使AF=1
若(AL)中高4位 >9 或 CF=1
则(AL) — 60H →(AL),并使CF=1
DAS指令影响CF、SF、PF、AF、ZF 不影响OF
逻辑运算和移位类
1.逻辑运算
逻辑运算指令对操作数的要求大多与MOV指令相同。“非”运算指令要求操作数不能是立即数
除“非”运算指令外,其余指令的执行都会使标志位OF=CF=0
1)“与”指令AND
格式: AND OPRD1,OPRD2
实现两操作数相与的运算
使目标操作数的某些位不变,某些位清零
在操作数不变的情况下使CF和OF清零
源操作数可以是立即数、寄存器或存储器 目标操作数可以是寄存器或存储器
应用实例
AND AL,0FH
AND CX,0FF00H
AND AX,BX
AND AX,[BX]DATA
AND AX,AX
;AX不变,CF=OF=0
2)“或”指令OR
OR OPRD1,OPRD2
操作: 两操作数相“或”, 结果送目标地址。
OR AL,20H
OR AX,00FFH
OR [BX],AL
应用
实现两操作数相“或”的运算
使某些位不变,某些位置“1”
在不改变操作数的情况下使OF=CF=0
3)“非”运算指令NOT
格式:NOT OPRD
操作:操作数按位取反再送回原地址
指令中的操作数不能是立即数
指令的执行对标志位无影响
4)“异或”运算指令XOR
格式: XOR OPRD1,OPRD2
操作: 两操作数相“异或”, 结果送目标地址。
5)“测试”指令TEST
格式: TEST OPRD1,OPRD2
操作: 执行“与”运算,但运算的结果 不送回目标地址。
应用:常用于测试某些位的状态
2. 移位指令
1) 非循环移位指令
算术左移和逻辑左移SAL(有符号数)/SHL(无符号数)
SAL OPRD,1
SAL OPRD,CL
SHL OPRD,1
SHL OPRD,CL
最高位或最低位移入CF
移动一位后,若CF与最高不相等,则OF=1;否则OF=0
区别:SHL将操作数视为无符号数,SAL将操作数视为有符号数。
OF=1对SHL指令不表示左移溢出,对SAL指令表示左移后超出了符号数的表示范围。
逻辑右移SHR
格式: SHR OPRD,1 SHR OPRD,CL
移动一位后,若次高位与最高位不相等,则OF=1;否则OF=0
SHR 指令影响标志位CF和OF。
如果移动次数为1,且移位之后新的最高位和次高位不相等,则标志位OF=1,否则OF=0。若移位次数不为1,则OF状态不定。
SHR相当于无符号数整除以2的i次方
算术右移SAR
格式: SAR OPRD,1 SAR OPRD,CL
SAR AL,1
SAR SI,CL
SAR WORD PTR[BX],1
SAR 指令影响标志位:CF、OF、PF、SF和ZF,AF值不变。
SHR相当于有符号数整除以2的i次方
2) 循环移位指令
不带进位位的循环左移指令ROL
指令格式: ROL OPRD,1 ROL OPRD,CL
ROL指令影响标志位CF和OF。
如果移动次数为1,且移位之后新的最高位和次高位不相等,则标志位OF=1,否则OF=0。
若移位次数不为1,则OF状态不定。
不带进位位的循环右移指令ROR
指令格式: ROR OPRD,1 ROR OPRD,CL
带进位位的循环左移指令RCL
指令格式: RCL OPRD,1 RCL OPRD,CL
带进位位的循环右移指令RCR
2.程序控制指令
1.无条件转移指令 JMP
通过修改指令的偏移地址或段地址及偏移地址实现程序的转移
格式: JMP OPRD 目标地址
(1)无条件段内直接转移
段内直接短转移
偏移地址为8位,转移范围为–128~+127B,在标号前加运算符SHORT;
段内直接近转移
偏移地址为16位,转移范围为–32768~+32767B,在标号前加运算符NEAR,缺省时为近转移。
(2)无条件段内间接转移
指令中的操作数是16位的寄存器或者存储器地址;
可以采用各种寻址方式;
指令的执行是用指定的寄存器内容或者两个存储器单元内容作为目标的偏移地址来代替原来的IP的内容。
2、条件转移指令
在满足一定条件下,程序转移到目标地址继续执行
条件转移指令均为段内短转移,即转移范围为:-128~+127
C标志 JB/JNAE/JC ;C=1转移即低于转移
JNB/JAE/JNC ;C=0转移即高于转移
Z标志 JE/JZ ;Z=1转移即相等或等于零转移
JNE/JNZ ;Z=0转移即不等或不为零转移
S标志 JS ;S=1转移即符号为负转移
JNS ;S=0转移即符号为正转移
P标志 JP/JPE ;P=1转移即偶转移
JNP/JPO ;P=0转移即奇转移
O标志 JO ;O=1转移即溢出转移
JNO ;O=0转移即未溢出转移
3. 循环控制指令
控制程序在以当前IP为中心的-128~+127范围内循环执行
循环次数由CX寄存器指定
不影响标志位
(1)无条件循环指令LOOP
格式: LOOP LABEL
循环条件: CX ≠ 0
操作: DEC CX JNZ 符号地址
4.过程调用返回指令
调用指令的执行过程
将调用指令的下一条指令的地址(断点)压入堆栈
获取子过程的入口地址(子过程第1条指令的偏移地址)
(执行子过程,含相应参数的保存及恢复)
将断点偏移地址由堆栈弹出,返回原程序
(1)段内直接调用
子过程与原调用程序在同一代码段,在调用之前只需保护断点的偏移地址
格式:CALL NEAR PROC
执行过程:
(SP) ← (SP)-2
(SP)+1← (IPH)
(SP) ← (IPL)
(IP) ← (IP)+ 16位偏移量
(2)段内间接调用
指令格式: CALL OPRD OPRD为16位寄存器内容或者两个存 储器单元内容。
CALL AX ;(IP)←(AX)
CALL WORD PTR[BX] ;(IP)←((BX+1):(BX))
返回指令
从堆栈中弹出断点地址,返回原程序
格式:RET RET n
RET指令一般位于子程序的最后
RET指令不影响标志位
中断指令
中断指令的用途: 用户程序可通过中断指令调用操作系统提供的特殊子程序(称为系统功能调用)。
用来实现一些特殊的功能。如调试程序时单步、断点等。
调用BIOS提供的硬件低层调用。
(1)INT指令
格式: INT n
将FLAGS压入堆栈
(TF)←0, (IF)←0
将INT指令下一条指令的CS、IP压栈
取中断服务程序入口地址
(IP) ← ((n×4+1): (n×4)) (CS) ← ((n×4+3): (n×4 +2))
(2) 溢出中断指令INTO
格式: INTO 相当于 INT 4
若OF=1,则启动一个类型为4的中断过程,给出一个出错标志,如果OF=0,不做任何操作。
INTO指令通常安排在有符号数加减运算指令之后。
(3) 中断返回指令
格式: IRET
中断服务程序的最后一条指令,负责回复断点 恢复标志寄存器内容
指令的操作
(IP) ← ((SP+1): (SP)), (SP) ← (SP)+2
(CS) ← ((SP+1): (SP)), (SP) ← (SP)+2
(FLAGS) ← ((SP+1): (SP)), (SP) ← (SP)+2
指令对对各标志位均有影响。