汇编语言笔记-整数的加减乘除等指令
整数的加法和减法指令
能完成字节、字或双字长度操作数的加减运算
- add 目的操作数,源操作数
- sub 目的操作数,源操作数
另外还有inc和dec 指令,用来进行加一减一操作,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 源操作数
源操作数可以是字节,字或者双字,也可以放在储存器或者寄存器,另一个乘数总在累加器中。
自我总结:
源操作数位数 | 源操作数单位 | 另一个乘数存放位置 | 答案位数 | 寄存器单位 | 答案存放位置 |
---|---|---|---|---|---|
8 | Byte | AL | 16 | Word | AX |
16 | Word | AX | 32 | Word | AX(底16位):DX(高16位) |
32 | Dword | EAX | 64 | DWord | EAX(底32位):EDX(高32位) |
imul
imul具有三种格式:
- imul 源操作数
这部分和mul大致相同,源操作数不能是立即数,同时注意符号位 - imul 寄存器,源操作数
操作数必须是字或者双字,而不能是字节。 - imul 寄存器,源操作数,立即数
其中,寄存器用来存放乘积,
整数的除法指令
和乘法指令有丝相似。
- idiv:用于有符号二进制补码整数
- div:用于无符号整数的除法
注意,但操作数乘法指令用乘数和被乘数相乘,并且得到一个两倍长的成绩。而除法指令用一个两倍长的数作为被除数,用一个单倍长度的数作为除数,最后得到单倍长度的商和单倍长度的余数。
idiv 源操作数
div 源操作数
被除数位置 | 被除数 | 除数 | 商 | 余数 |
---|---|---|---|---|
AX | Word | Byte | AL | AH |
DX(H):AX(L) | Dword | Word | AX | DX |
EDX(H):EAX(L) | 2Dword | Dword | EAX | EDX |
除法指令不会改变源操作数(除数)!!
对所有的出发操作数,必须满足:
被除数 = 商 * 除数 + 余数
cbw,cwd,cdq和cwde
以上四个指令都是可以对数进行扩展操作(正用0,负用1),且都没有操作数,默认对对应的寄存器进行操作,如下
- c:change
- b:byte
- w:word
- d:dword
- q:双dword
原类型 | 目的类型 | 指令 | 源操作数 | 目的操作数 |
---|---|---|---|---|
字节 | 字 | cbw | AL | AX |
字 | 双字 | cwd | AX | DX:AX |
字 | 双字 | cwde | AX | EAX |
双字 | 四字 | cdq | EAX | EDX:EAX |
movzx和movsx
movzx 寄存器,源操作数
总是用位为0来扩展源操作数。
movsx 寄存器,源操作数
用复制符号位来扩展源操作数