汇编 运算介绍

算术运算符

加法:

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

 

输出需要将axdx拼接起来输出

自增加法  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 axbx

 

乘法指令 170个指令周期

分有无符号

无符号  mul      有符号  imul

8位 相乘     ah <- al  ah <- al 高位放ah mul  alal

16位相乘     dx <- ax  dx <- ax 高位放dx imul ax ax

 

除法指令 184个指令周期

也是分有无符号

无符号  div      有符号  idiv

8位 相除     al <- ax  al <- ax ax相除结果放在al div axbl

16位相除     ax <- dx ax <- dx dxax相除结果放在axidiv ax bx

8位相除  ah放余数  al放除数

16位相除  dx放余数 ax放除数

 

符号扩展  2个指令周期

Cbwal的符号扩展到ah   al  ffh    cbw后  ax ffffh

Cwdax的符号扩展到dx ax ffffh   cwb后  dx ffffh

 

十进制调整指令

八进制 155+166 =343     看做十进制计算为 321    前面进位后面加差值2

进制调整指令就是计算方式用十进制计算方式转为八进制

Bcd码  4位表示十进制 0001  0000   表示十进制的10

Daa  :  bcd

Mov al19h

Add al1 al  ==  1ah

Daa al == 20h

  

Aaa :非bcd

Mov ax0109h

Add ax1 ; ax  ==  010fh

Aaa ax ==  020h

 

Daa  :  bcd

Mov al19h

Add al1 al  ==  1fh

Daa   al  ==  19h

  

Aas :非bcd

Mov ax0200h

Add ax1 ; 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  alal

 

位移需要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 相当于除法

 

posted @ 2020-09-05 16:40  特权E5  阅读(499)  评论(0编辑  收藏  举报