16位汇编第六讲----8086指令集(2)
来源:互联网 发布:韩国81端口活跃ip段 编辑:程序博客网 时间:2024/05/17 02:52
0x00 算术运算类指令
掌握:ADD/ADC/INC、SUB/SBB/DEC/ NEG/CMP
熟悉:MUL/IMUL、DIV/IDIV
理解:CBW/CWD、DAA/DAS、 AAA/ AAS/AAM/AAD
- 加法指令ADD
ADD reg,imm/reg/mem ;reg←reg+imm/reg/memADD mem,imm/reg ;mem←mem+imm/reg
- 带进位加法指令ADC
ADC指令将源与目的操作数相加,再加上进位CF标志,
结果送到目的操作数 ADC指令按状态标志的定义相应设置
ADC指令主要与ADD配合,实现多精度加法运算
ADC reg,imm/reg/mem ;reg←reg+imm/reg/mem+CFADC mem,imm/reg ;mem←mem+imm/reg+CF
作用:
mov ax,4652h ;ax=4652hadd ax,0f0f0h ;ax=3742h,CF=1mov dx,0234h ;dx=0234hadc dx,0f0f0h ;dx=f325h,CF=0;DX.AX=0234 4652H +F0F0 F0F0H =F325 3742H
- 增量指令INC(increment)
作用:
INC指令对操作数加1(增量)INC指令不影响进位CF标志,按定义设置其他状态标志
INC reg/mem;reg/mem←reg/mem+1
例子:
inc bxinc byte ptr [bx]
- 减法指令SUB(subtract)
作用:
SUB指令将目的操作数减去源操作数,结果送到目的操作数
SUB指令按照定义相应设置状态标志
SUB reg,imm/reg/mem ;reg←reg-imm/reg/memSUB mem,imm/reg ;mem←mem-imm/reg
例子:
mov al,0fbh ;al=0fbhsub al,07h ;al=0f4h,CF=0
- 带借位减法指令SBB
作用:
SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数。
SBB指令按照定义相应设置状态标志
SBB指令主要与SUB配合,实现多精度减法运算
SBB reg,imm/reg/mem ;reg←(reg-(imm/reg/mem)-CF)SBB mem,imm/reg ;mem←mem-imm/reg-CF
例子:
mov ax,4652h ;ax=4652hsub ax,0f0f0h ;ax=5562h,CF=1mov dx,0234h ;dx=0234hsbb dx,0f0f0h ;dx=1143h,CF=1;DX.AX=0234 4652H -F0F0 F0F0H =1143 5562H
- 减量指令DEC(decrement)
作用:
DEC指令对操作数减1(减量)
DEC指令不影响进位CF标志,按定义设置其他状态标志
DEC reg/mem;reg/mem←reg/mem-1
INC指令和DEC指令都是单操作数指令主要用于对计数器和地址指针的调整
- 求补指令NEG(negative)
作用:
NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数
求补运算也可以表达成:将操作数按位取反后加1
NEG指令对标志的影响与用零作减法的SUB指令一样
NEG reg/mem;reg/mem←0-reg/mem
Neg的妙用
判断if(ax == 0) ax==0 else ax==1
neg axmov ax,0adc ax,0
以上语句就可以作为一个简单的三目运算
- 比较指令CMP(compare)
CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志
CMP指令执行的功能与SUB指令,但结果不回送目的操作数
CMP reg,imm/reg/mem ;reg-imm/reg/memCMP mem,imm/reg ;mem-imm/reg
例子:
cmp al,100 ;al-100 jz below ;al==100,跳转到below执行 sub al,100 ;al!=100, al←al-100 inc ah ;ah←ah+1below: ...
- 乘法指令
不带符号位的乘法
MUL r8/m8;无符号字节乘法;AX←AL×r8/m8MUL r16/m16;无符号字乘法;DX.AX←AX×r16/m16
带符号位的乘法
IMUL r8/m8;有符号字节乘法;AX←AL×r8/m8IMUL r16/m16;有符号字乘法;DX.AX←AX×r16/m16
乘法指令如下影响OF和CF标志:
MUL指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1
IMUL指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1
- 除法指令
不带符号位的乘法
DIV r8/m8 ;无符号字节除法:AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数DIV r16/m16 ;无符号字除法:;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数
带符号位的乘法
DIV r8/m8 ;有符号字节除法:AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数IDIV r16/m16;有符号字除法:;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数
除法的功能:
1.除法指令分无符号和有符号除法指令
2.除法指令的除数显式给出,隐含使用另一个操作数AX和DX作为被除数
字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH
字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数存入DX
3.除法指令对标志没有定义
4.除法指令会产生结果溢出
除法错中断
1. 当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器AL/AX不能表达,便产生溢出,8086CPU中就产生编号为0的内部中断——除法错中断
2.对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位,则发生除法溢出
3.对IDIV指令,除数为0,或者在字节除时商不在-128~127范围内,或者在字除时商不在-32768~32767范围内,则发生除法溢出
- 16位汇编第六讲----8086指令集(2)
- 16位汇编第六讲汇编指令详解第二讲
- 16位汇编第五讲----8086指令集(1)
- 16位汇编第七讲----8086指令集(3)
- 16位汇编第八讲----8086指令集(4)
- 16位汇编第八讲----8086指令集(5)【控制转移类指令】
- 16位汇编第十讲----8086指令集(6)【子程序与中断】
- 16位汇编第五讲各种指令详解第一讲
- 16位汇编第八讲指令第四讲
- 16位汇编第七讲汇编指令详解第第三讲
- 16位汇编第九讲汇编指令以及逆向中的花指令
- 16位汇编指令
- 16位汇编第四讲----8086寻找方式
- 16位汇编第二讲----8086的寄存器(2016.12.01)
- 16位汇编中的伪指令
- 16位汇编第一讲----Debug的使用以及Hello World(2016.11.29)
- 32位汇编第三讲----【RedASM与代码注入】(2016-12-16)
- 汇编总结 标志位/指令
- kafka环境搭建1-单机版
- 一.简单批处理内部命令简介
- 数据特征选择
- Android开发 创建桌面图标和widget的示例
- 博客开篇啦
- 16位汇编第六讲----8086指令集(2)
- 实验_图片查看器
- RTMPdump源码分析: HandShake(4)
- 通过项目逐步深入了解Mybatis(四)
- Javascript 笔记 DAY7
- 【ROS】launch启动文件
- 一个Thread中只有一个Looper源码解释
- mysql基础---数据库设计(三大范式)(八)
- 133. Clone Graph