汇编语言学习笔记-整数的加减乘除等指令

整数的加法和减法指令

能完成字节、字或双字长度操作数的加减运算

特别注意:有些指令并没有说明源操作数能为立即数,则在该条指令中,如果源操作数为立即数,则报错,如:mul,div等,因为,如果没有指明其操作位数,则不知道从哪一个寄存器找到另一个操作数。

 - add 目的操作数,源操作数
 - sub 目的操作数,源操作数

另外还有incdec 指令,用来进行加一减一操作,neg 指令进行单操作数的补码

以上提到的指令和mov,xchg指令有所不同,他们都会对EFLAG寄存器的标志位进行更新。根据操作数的结果来设置SF、ZF、OF、AF、CF标志位的值。

 - CF:进位标志位。在无符号运算时,记录了运算结果的最高有效位向更高位的进位值或从更高位借位,产生进位或借位时CF=1,否则CF=0;
 - PF:奇偶标志位。相关指令执行后结果所有bit中1的个数为偶数,那么PF=1,1的个数为奇数则PF=0;
 - AF:辅助进位标志位。运算过程中看最后四位,不论长度为多少。最后四位向前有进位或者借位,AF=1,否则AF=0;
 - ZF:零标志位。相关指令执行后结果为0那么ZF=1,结果不为0则ZF=0;
 - SF:符号标志位。相关指令执行后结果为负那么SF=1,结果非负数则SF=0;
 - TF:调试标志位。当TF=1时,处理器每次只执行一条指令,即单步执行;
 - IF:中断允许标志位。它用来控制8086是否允许接收外部中断请求。若IF=1,8086能响应外部中断,反之则屏蔽外部中断;
 - DF:方向标志位。在串处理指令中,每次操作后,如果DF=0,si、di递增,如果DF=1,si、di递减;注意此处DF的值是由程序员进行设定的 cld命令是将DF设置为0,std命令是将DF设置为1;
 - OF:溢出标志位。记录了有符号运算的结果是否发生了溢出,如果发生溢出OF=1,如果没有OF=0;

add

add 目的操作数,源操作数
执行加法指令时,源操作数中的整数和目的操作数的整数部分相加,相加的结果将取代目的操作数中原来的值

sub

sub 目的操作数,源操作数
目的操作数中的整数减去源操作数中的整数,相减的差将取代目的操作数原来的值
在这里插入图片描述

inc、dec和neg

inc 目的操作数
自加1
dec 目的操作数
自减1
neg 目的操作数
取反
在这里插入图片描述
在这里插入图片描述

整数的乘法指令

有两条指令:

  • imul:把操作数作为有符号数,乘积结果的符号由有符号数的乘法规则决定
  • mul:把操作数作为无符号二进制数
    如果是非负树进行乘法运算,通常是使用mul而不是imul,因为mul的速度更快

mul

mul 源操作数
源操作数可以是字节,字或者双字,也可以放在储存器或者寄存器,另一个乘数总在累加器中。

为什么要用双倍的长度去存值:
假如现在使用cl运算(假设都是最大值)

mul cl

则实际上的运算是:
al*cl=byte*byte=2的8次方*2的8次方=2的16次方=word
所以无论怎么变值,都不会超过word长度,但是可能会超过byte长度。因此需要一个与当前长度匹配的寄存器来存放可能超出当前长度的部分
除法同理

自我总结:

源操作数位数源操作数单位另一个乘数存放位置答案位数寄存器单位答案存放位置
8ByteAL16WordAL(底8位):AH(高8位)
16WordAX32WordAX(底16位):DX(高16位)
32DwordEAX64DWordEAX(底32位):EDX(高32位)

在这里插入图片描述

imul

imul具有三种格式:

  • imul 源操作数
    这部分和mul大致相同,源操作数不能是立即数,同时注意符号位
  • imul 寄存器,源操作数
    操作数必须是字或者双字,而不能是字节。
  • imul 寄存器,源操作数,立即数
    其中,寄存器用来存放乘积,

在这里插入图片描述

整数的除法指令

和乘法指令有丝相似。

  • idiv:用于有符号二进制补码整数
  • div:用于无符号整数的除法

注意,但操作数乘法指令用乘数和被乘数相乘,并且得到一个两倍长的成绩。而除法指令用一个两倍长的数作为被除数,用一个单倍长度的数作为除数,最后得到单倍长度的商和单倍长度的余数。
idiv 源操作数
div 源操作数

被除数位置被除数除数余数
AH(H):AL(L)WordByteALAH
DX(H):AX(L)DwordWordAXDX
EDX(H):EAX(L)2DwordDwordEAXEDX

除法指令不会改变源操作数(除数)!!
对所有的出发操作数,必须满足:

  • 被除数 = 商 * 除数 + 余数
  • 余数的符号和被除数相同(位运算里面也有相关的除法,但是其余数的符号可能和被除数相反)

在这里插入图片描述
在这里插入图片描述

cbw,cwd,cdq和cwde

以上四个指令都是可以对数进行扩展操作(正用0,负用1),且都没有操作数,默认对对应的寄存器进行操作,如下

  • c:change
  • b:byte
  • w:word
  • d:dword
  • q:双dword
原类型目的类型指令源操作数目的操作数
字节cbwALAX
双字cwdAXDX:AX
双字cwdeAXEAX
双字四字cdqEAXEDX:EAX

在这里插入图片描述

movzx和movsx

movzx 寄存器,源操作数
总是用位为0来扩展源操作数。

movsx 寄存器,源操作数
用复制符号位来扩展源操作数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hanzoe_lwh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值