加法指令
普通加法指令(ADD)
普通加法指令格式如下:
ADD OPRD1, OPRD2
这条指令两个操作数相加,结果送至目的操作数 OPRD1,即:
OPRD1<== OPRD1 + OPRD2
ADD 指令对各标志位的影响:
带进位加法指令(ADC)
带进位加法指令格式如下:
ADC OPRD1, OPRD2
这条指令与ADD指令类似,完成两个操作数相加,但还要把进位标志CF的值加上去,把结果传送至目的操作数 OPRD1 即:
OPRD1 <== OPRD1 + OPRD2 + CF
ADC指令的运用:
验证 ADC 运算指令
1
2
3
4mov ax,2
mov bx,1
sub bx,ax
adc ax,1计算超过 16 位数的加法
1
2
3
4
5;计算 ffffh+1 的值
;DX:AX(高16位:低16位)
mov ax,ffff
add ax,1
adc dx,0
1 | ;计算 1ef000h+201000h,结果存放在 AX 高 16 位,和 BX 低 16 位。 |
加1指令(INC)
加 1 指令格式如下:
INC OPRD
这条指令完成对操作数 OPRD 加 1,然后把结果送回OPRD,即:
OPRD <== OPRD+1
例如:
1 | inc al |
操作数可以是通用寄存器,也可以是存储单元。这条指令执行的结果影响标志 ZF、SF、OF、PF 和 AF,但不影响 CF。
- 验证 INC 指令不影响 CF 位
INC 指令确实不会影响 CF 位,那为什么会这样呢?
个人认为:因为 INC 指令通常用在循环语句中,且主要用于偏移地址的运算,偏移地址加 1 严格意义上来说并不属于算数运算指令,所以没有必要把 CF 位置为 1。如果在循环中 INC 指令把 CF 位置 1 了,这样会影响到算数运算指令的结果。
减法指令
普通减法指令(SUB)
普通减法指令格式如下:
sub OPRD1, OPRD2
这条指令完成两个操作数相减,从 OPRD1 中减去 OPRD2,结果送到目标操作数 OPRD1 中,即:
OPRD1<== OPRD1 - OPRD2
SUB 指令对各标志位的影响:
带进(借)位减法指令(SBB)
带进(借)位减法指令:
SBB OPRD1, OPRD2
这条指令与sub指令类似,再操作数 OPRD1 减去操作数 OPRD2 的同时好药减借位(进位)标志 CF 位的值,即:
OPRD1<== OPRD1-OPRD2-CF
例如:计算 003E1000H-00202000H,结果放在AX:BX中
1 | mov bx,1000h |
减 1 指令(DEC)
减1指令格式如下:
DEC OPRD
这条指令把操作数 OPRD 减 1,并把结果送回 OPRD,即:
OPRD <== OPRD-1
DEC 指令和 INC 的作用一样,且不会影响 CF 位。
取补指令(NEG)
比较指令(CMP)
乘法指令
在乘法指令中,被乘数是一个隐含的操作数AL(8位数相乘)或者 AX(16位数相乘)。乘数可以用除立即数以外的任何一种寻址方式。
无符号数乘法指令(mul)
无符号数指令格式:
MUL OPRD
- 如果 OPRD 是 8 位的字节操作数,则 AL*OPRD ,16 位结果送到 AX 中
- 如果 OPRD 是 16 位的字操作数,则 AX*OPRD,32位结果传送到 DX:AX 中,DX 为高 16 位,AX 为低 16 位。
例如:
1 | MUL BL |
如果乘积结果的高半部分(字节相乘时为 AH,字相乘时为 DX)不等于零,则标志位 CF=1,OF=1;否则CF = 0,OF = 0
有符号数乘法指令(imul)
有符号数指令格式:
IMUL OPRD
- 如果 OPRD 是 8 位的字节操作数,则 AL*OPRD ,16 位结果送到 AX 中
- 如果 OPRD 是 16 位的字操作数,则 AX*OPRD,32位结果传送到 DX:AX 中,DX 为高 16 位,AX 为低 16 位。
例如:
1 | IMUL CL |
如果乘积结果的高半部分(字节相乘时为 AH,字相乘时为 DX)不是低半部分的符号扩展,则标志位 CF=1,OF=1;否则CF = 0,OF = 0
除法指令
在除法指令中,被除数是一个隐含的操作数AX(除数是8位数)或者 DX:AX(除数是16位数)。除数可以用除立即数以外的任何一种寻址方式。
无符号数除法指令(div)
有符号数除法指令(idiv)
符号扩展指令
由于除法指令隐含使用字被除数或双字被除数,所以在做除法操作之前需要先将 AH 或者 DX 重置,避免出现运算错误。为此8086专门提供了符号扩展指令。
字节转换为字指令(CBW)
字节转换为双字指令(CWD)
除数为0
除以8位,商超过 8 位,出现除法溢出。
代码练习
分为两部分:完善代码片段+练习相关算数运算指令
add.asm
1 | ;程序名:add.asm |
add.asm 优化
- 定义一个变量验证执行结果
- 增加 “复制字符串” 功能
- 最后运算结果在 DX:AX 中,并存储到变量 result 中
- 打印 result 变量中存储的结果
1 | ;程序名:add1.asm |
sub.asm
1 | ;程序名:sub.asm |
mul.asm
1 | ;程序名:mul.asm |
div.asm
1 | ;程序名:div.asm |
summary.asm
算数运算代码总结
1 | ;程序名:summary.asm |
- 本文标题:8086汇编-算数运算指令
- 本文作者:9unk
- 创建时间:2022-05-07 09:49:05
- 本文链接:https://9unkk.github.io/2022/05/07/8086-hui-bian-suan-shu-yun-suan-zhi-ling/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!