8086汇编(16位汇编)学习笔记04.乘除和移位指令-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net乘法和除法指令用的不多,因为效率很低
比较指令CMP (compare)
•格式:CMP OPD,OPS
•功能:(OPD) — (OPS),跟减法指令很像,但是不存结果
•说明:目的操作数减去源操作数,然后根据结果设置标志位,但该结果并不存入目的地址。
•影响标志位:AF、CF、OF、PF、SF 、 ZF
• 作用:一般的后面跟一条条件转移指令,根据比较结果转向不同的程序分支,用于处理OPD和OPS大小比较的不同情况。
操作
跟一个比自己大的数比较, 结果看标志位 CF(借位/进位) 和 ZF (是否为0)
跟一个比自己小的数比较, 结果看标志位 SF(符号) 和 ZF (是否为0)
69 - 45 不产生借位,结果是正数,不为0.
跟一个与自己相等的数比较, 结果看标志位 ZF (是否为0)
69-69 结果为0,不为负数,不产生借位
乘法
计算机的乘法指令分为无符号乘法指令和有符号乘法指令。
它们的唯一区别就在于: 数据的最高位是作为“数值”参与运算,还是作为“符号位”参与运算。
功能:指令的功能是把显式操作数和隐含操作数相乘,并把乘积存入相应的寄存器中。
无符号乘法 MUL
格式:MUL Reg/Mem
MUL r8/m8; AX <- AL x r8/m8 ;如果源操作数是字节,则与AL相乘,结果存入AX(如果不满,则会覆写高位为00)
MUL r16/m16; DX.AX <- AX x r16/m16; 如果源操作数是字,则与AX相乘,结果高位放入DX,低位放入AX
功能:显式操作数*隐含操作数(看成无符号数)。
影响标志位:CF和OF。
位数 | 隐含的被乘数 | 乘积的存放位置 | 举例 |
---|---|---|---|
8位 | AL | AX | MUL BL |
16位 | AX | DX-AX | MUL BX |
32位 | EAX | EDX-EAX | MUL ECX |
DX 存高位 AX 存低位
影响标志位:CF 和 OF ; 利用CF和OF判断成绩的高位是否有效。
两种标志位情况:
**●**要么CF = OF = 1;
○8位:说明结果超过了8位
○16位:说明结果超过了16位
**●**要么CF = OF = 0
○8位:都能存下
○16位:都能存下
8位 * 8位 结果 最多为 16位
16位 * 16位 结果最多为 32 位
代码
8位 * 8位 结果超过了8 位 , 所以 标志位 CF 和 标志位 OF 的值都为1 ( OV CY )
DX存结果的高位,AX存结果的低位 ,16位 * 16位 结果超过了16 位 , 所以 标志位 CF 和 标志位 OF 的值都为1 ( OV CY )
如果 8位 * 8位 结果不超过8位 , 16位 * 16 位结果不超过16位, 标志位 CF 和 标志位 OF 的值都为0 ( NV NC )