汇编 运算介绍
算术运算符
加法:
Add ax, bx ;bx+ax => ax 加法运算
带进位加法指令 adc 32位加法
Mov ax , 0fffh 假设第一个数低位
Mov dx, 0 假设第一个数高位 0ffffh
Mov bx, 1 假设第二个数低位
Mov cx, 0 假设第二个数高位 00001h
Add ax, bx 先低位相加得到 0000h
Adc dx, cx 高位相加 在加进位 0001h
输出需要将ax,dx拼接起来输出
自增加法 3个指令周期
INC ax Inc byte ptr [bx]
减法
带进位减法 sbb 32位减法
Sub ax, bx 低位相减
Sbb dx, bx 高位借位
自减
Dec ax
补码 neg 0 - n 可以得到补码(不是取反加一) 3个指令周期
Mov ax, -1
Neg ax
比较指令 cmp
只比较,不改变操作数 cmp ax, bx
乘法指令 170个指令周期
分有无符号
无符号 mul 有符号 imul
8位 相乘 ah <- al ah <- al 高位放ah中 mul al,al
16位相乘 dx <- ax dx <- ax 高位放dx中 imul ax ,ax
除法指令 184个指令周期
也是分有无符号
无符号 div 有符号 idiv
8位 相除 al <- ax al <- ax ax相除结果放在al中 div ax,bl
16位相除 ax <- dx ax <- dx dx:ax相除结果放在ax中 idiv ax ,bx
8位相除 ah放余数 al放除数
16位相除 dx放余数 ax放除数
符号扩展 2个指令周期
Cbw: al的符号扩展到ah al ffh cbw后 ax ffffh
Cwd: ax的符号扩展到dx ax ffffh cwb后 dx ffffh
十进制调整指令
八进制 155+166 =343 看做十进制计算为 321 前面进位后面加差值2
进制调整指令就是计算方式用十进制计算方式转为八进制
Bcd码 4位表示十进制 0001 0000 表示十进制的10
加
Daa : bcd码
Mov al,19h
Add al,1 ;al == 1ah
Daa al == 20h
Aaa :非bcd码
Mov ax,0109h
Add ax,1 ; ax == 010fh
Aaa ax == 020h
减
Daa : bcd码
Mov al,19h
Add al,1 ;al == 1fh
Daa al == 19h
Aas :非bcd码
Mov ax,0200h
Add ax,1 ; ax == 01ffh
Aas ax == 0109h
乘法 aam 触发 aad
位操作指令
And ;&取位 置零
Mov al ,1111 1111 B b表示2进制
And al, 1000 0000 B al == 1000 0000b 80h
Mov al ,1111 1111 B
And al, 0111 1111 B al ==0111 1111b 7fh
Or al ,1 ;置1
Not al ;取反
Xor al , 0fh ;异或 安位取反 或者清零 al == 00h
Xor al,al
位移需要8个指令周期
Mov al , ffh 1111 1111h
Shl al , 1 ;逻辑左移《 feh 1111 1110 b 相当于乘法
Shr al , 1 ;逻辑右移》 7fh 0111 1111 b
Sal al , 1 ;算术左移《 feh 1111 1110 b 和逻辑左移没有区别 完全等价
Sal al , 1 ;算术右移》 ffh 1111 1111 b 相当于除法