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:

>> 循环移位


浙公网安备 33010602011771号