16位汇编 04

>> 乘法指令

 

>> 无符号乘法

 

格式:MUL Reg/Mem

功能:显示操作数*隐含操作数(看成无符号数)

影响标志位:CF和OF

 

 

16位乘法中, 乘积的高字节存放在DX中, 低字节存放在AX中

 

图1:

 

图2:

 

无符号乘法影响标志位

 

如果乘积的高一半位(AH/DX/EDX)包含有乘积的有效位, 则CF= 1, OF = 1; 否则,CF = 0, OF = 0;

 

OF = CF = 1则说明:

字节乘以字节结果超过了8位

字*字结果超过了16位

双字*双字结果超过了32位

 

>> 有符号乘法

 

IMUL

 

图1:

 

图2:

 

 

有符号乘法, 最后的计算结果前面会全部补上符号位, 负数全部补1, 正数全部补0

 

>> 除法指令

 

>>无符号除法

格式:

 

DIV Reg/Mem

 

指令号后面跟除数

 

 

 

被除数在前面, 默认的被除数,一个字节存放在AX寄存器中, 一个字的话,存放在DX-AX中

 

 

>> 有符号除法

 

IDIV

 

 

>> 除法溢出

 

 

 

>> 符号扩展指令

 

只能用于有符号

 

 

 

 

字节扩展字:CBW

固定使用AL和AH

 

字扩展成双字:CWD

固定使用AX, DX

 

>> 逻辑运算

 

与, 或, 非, 异或

 

结果存储在第一个操作数中

 

其中test是阉割版本的按位与, 不存储结果,只影响标志位

 

逻辑运算经常用于MFC之类的改变风格等等,

 

因为这些风格大都是按位存放, 几种风格相或, 就可以同时拥有这些风格。

 

取掉风格:

某些组合风格, 如果要去掉其中一种风格, 先把要去掉的这种风格各位取反, 然后把组合风格与取反后的结果按位与, 就能去掉这种风格

 

 

>> 移位指令

1:SHL——逻辑左移

2:SHR——逻辑右移

3:SAL——算数左移

4:SAR——算数右移

 

左操作数为寄存器, 或者内存, (要移位的数)

右操作数为1 或者寄存器cl里面大于1的值

 

算数移位和逻辑移位的区别:

1.汇编语言中的

 

逻辑右移(SHR)是将各位依次右移指定位数, 然后在左侧 补0,

 

算术右移(SAR)是将各位依次右移指定位数,然后在左侧用原符号位补齐


2.高级语言右移运算符(>>)是将一个数的二进位全部右移若干位,低位移出部分舍弃,左补0。


3.高级语言右移和汇编语言中的逻辑右移功能一样,但不同于算术右移。

 

 

图1:

 

图2:

 

 

 

>> 循环移位

 

 

 

posted @ 2022-03-03 20:47  冷酷的国度  阅读(149)  评论(0)    收藏  举报