汇编语言程序设计
格式:POPF 操作:
(FLAG)←((SP)+1,(SP)) (SP)←(SP)+2 5)类型转换指令
①CBW(convert byte to word) 字节转换为字命令 格式:CBW
操作:AL的内容符号括号到AH,形成AX中的字。
说明:若AL的符号位为0,则(AH)=0;若AL的符号位为1,则(AH)=0FFH。 例如:
(AL)=01H,则CBW执行后,(AX)=0001H (AL)=0F1H,则CBW执行后,(AX)=0FFF1H
②CWD(convert word to double word) 字转换为双字命令 格式:CWD
操作:AX的内容符号括号到DX,形成DX:AX中的双字。
2、算术运算指令 1)加法指令
包括:ADD、ADC、INC ① ADD不带进位位的加法指令 格式:ADD DST,SRC
操作:(DST)←(DST)+(SRC) ② ADC带进位位的加法指令 格式:ADC DST,SRC
操作:(DST)←(DST)+(SRC)+CF ③ INC增量指令 格式:INC OPR
操作:(OPR)←(OPR)+1 说明: ① 均可为字/字节操作 ② 均影响标志位,但INC不影响CF标志位 ③ 对标志位的影响 ·结果为负,则SF=1,否则SF=0 ·结果为0,则ZF=1,否则ZF=0 ·最高有效位有进位时CF=1,否则CF=0
- 15 -
汇编语言程序设计
·当两个操作数的符号相同,而结果的符号与之相反,则OF=1,否则OF=0 ④ CF=1表示无符号加法溢出 OF=1表示带符号加法溢出
2)减法指令
包括:SUB、SBB、DEC、NEG、CMP ① SUB不考虑借位的减法指令 格式:SUB DST,SRC
操作:(DST)←(DST)-(SRC) ② SBB考虑借位的减法指令 格式:SBB DST,SRC
操作:(DST)←(DST)-(SRC)-CF ③ DEC减量指令 格式:DEC OPR
操作:(OPR)←(OPR)-1 ④ NEG求补指令 格式:NEG OPR
操作:(OPR)←0FFFFH-(OPR)-1 (字) (OPR)←0FFH-(OPR)-1 (字节)
即各位取反加1
如:NEG AX
设(AX)=1234H,则结果(AX)=0EDCCH ⑤ CMP比较指令
格式:CMP OPR1,OPR2
操作:(OPR1)-(OPR2),结果不保存,只根据结果设置标志位 说明:
1、均可为字/字节操作
2、均影响标志位,但DEC不影响CF 3、对标志位的影响 ·① ② ⑤:CF:有借位时CF=1 ·① ② ③ ⑤:OF:若两个操作数的符号相反,而结果与减数的相同,则OF=1 ·④ :CF:OPR为0,则CF=0,否则CF=1(实际还是最高有效位产生进位)
OF:字节运算时OPR为-128或字运算时OPR为-32768时,OF=1,否则为0
(求补即为求其相反数的补码,实际还是超出了机器的表示范围)
- 16 -
汇编语言程序设计
3)乘法指令
包括:MUL 无符号相乘、IMUL带符号数相乘
格式:MUL SRC 或 IMUL SRC 操作:
字节:(AX)←(AL)*(SRC)
字:(DX,AX)←(AX)*(SRC) 说明: ① 由SRC决定是字操作还是字节操作 ② SRC不可用立即寻址 ③ 对标志位的影响
◆对除CF和OF以外的条件码无定义。(无定义即运算后条件码的状态不定) ◆对CF和OF的影响:
MUL:若乘积的高一半为0,则CF和OF位均为0,否则为1。
IMUL:若乘积的高一半为低一半的符号扩展,则CF和OF位均为0,否则为1。 注意:可通过CF,OF判断乘积是否扩展到了高一半。 4)除法指令
包括:DIV 无符号数除法、IDIV带符号数的除法
格式:DIV SRC 或 IDIV SRC 操作: 字节:
(AL)←(AX)/(SRC)的商 (AH)←(AX)/(SRC)的余数 字:
(AX)←(DX,AX)/(SRC)的商 (DX)←(DX,AX)/(SRC)的余数 说明: ① SRC不允许为立即寻址方式 ② 除法指令对各标志位无定义 ③ 8086中规定余数符号和被除数的符号相同 例如:-30/8 商 余数 -4 2 × -3 -6 √ ④ 若被除数与除数的位数相同,需要对被除数进行扩展 例如:-8/2 程序为: MOV AX, -8 MOV AL,-8 MOV BL,2 MOV BL,2 IDIV BL CBW - 17 - 汇编语言程序设计
IDIV BL 结果:商al=0fcH,余数ah=0
3、逻辑运算和移位指令 1) 逻辑运算指令
包括AND、OR、NOT、XOR、TEST ① AND 逻辑与指今 格式:AND DST,SRC
执行的操作:(DST)←(DST)∧ (SRC) 注:常用于屏蔽某些位
例如:屏蔽AL的第0,1,4位。 MOV AL,0BFH AND AL,0ECH ② OR 逻辑或指令 格式:OR DST,SRC
执行的操作:(DST)←(DST)∨ (SRC) 注:常用于对某些位置1。 例如:置BL的第1,5位为1 MOV BL,87H OR BL,22H ③ NOT 逻辑非指令 格式:NOT OPR
执行的操作:(OPR)←(OPR) ④ XOR 异或指令
格式:XOR DST,SRC
执行的操作:(DST)←(DST)?(SRC)
注:常用于对某些位取反。
例如:将ax的第0,4,7,12,14位取反。 MOV AX,4A3BH XOR AX,5091H ⑤ TEST 测试指令
格式:TEST OPRl,OPR2 执行的操作:(OPRl)∧ (OPR2) (不保存结果,根据结果设置标志位) 注:常用于测试某些位是否为0。
例如:测试al的第0,1,2,3,5,7位是否为0. MOV AL,40H TEST AL,0AFH ZF=1:结果为0.
- 18 -
汇编语言程序设计
说明:
1. 可以为字/字节操作 2. 对标志位的影响: ★ NOT不影响标志位 ★ 其余的指令使CF,OF为0,AF无定义,SF,ZF,PF根据结果设置。
2) 移位指令
包括:SHL,SHR,SAL,SAR,ROL,ROR,RCL,RCR ① 逻辑左移指令
格式:SHL OPR,CNT
注:CNT=1时,可以直接写1,如:SHL OPR,1 CNT>1时 必须把CNT放在CL中。
如:要将AX逻辑左移5位 MOV CL,5 SHL AX,CL
操作:
② 算术左移指令
格式:SAL OPR,CNT 操作:与SHL相同 ③ 逻辑右移指令
格式:SHR OPR,CNT 操作:
④ 算术右移指令
格式:SAR OPR,CNT 操作:
- 19 -