在前面一节谈到,在汇编中对于加法和减法指令是没有所谓的有符号数加法和有符号数减法,统一通过补码进行运算,然后再根据标识寄存器的相关标识位进行判断,来辨别运算结果是否正确,主要是以OF,SF和CF的对比来判断。
但是乘法指令和除法指令区分了相关的有符号操作和无符号操作,因为在运算的结果中需要进行符号位的扩展。
乘法指令和除法指令都分为字节和字的操作,如果是两个8bit位的操作数,则结果存放在AX中,如果是两个16bit的操作数,则操作数和结果放在AX和DX中。
(1)无符号数的乘法指令
指令格式如下:
MUL OPRD
如果OPRD是8bit位的无符号数,那么有一个隐藏数在AL中,最后的结果放在AX中。
如果OPRD是16bit位的无符号数,那么有一个隐藏数在AX中,最后的结果是低字放在AX中,高字放在DX中。
对于标志为的影响比较特殊:
如果高半部分不为0,则CF = 1,OF=1(说明操作结果有效),如果为0则CF=OF=0,说明CF和OF是对高半部分进行记录,但是对其它FLAG位的影响没有定义。
(2)有符号数的乘法指令
格式如下:
IMUL OPRD
如果OPRD是8bit位的无符号数,那么有一个隐藏数在AL中,最后的结果放在AX中。
如果OPRD是16bit位的无符号数,那么有一个隐藏数在AX中,最后的结果是低字放在AX中,高字放在DX中。
对于标志为的影响比较特殊:
如果高半部分是低半部分的符号扩展,则CF =OF=0(说明操作结果有效),如果不是符号扩展则CF=OF=1,说明CF和OF是对高半部分进行记录,但是对其它FLAG位的影响没有定义。
乘法指令适应于我们前面介绍的所有寻址方式。
(3)无符号的除法指令
格式如下:
DIV OPRD
如果OPRD是8bit位的无符号数,那么有一个隐藏数在AX中,最后的结果AL保存商,AH保存余数。
如果OPRD是16bit位的无符号数,那么有隐藏数在AX、Dx中,其中AX保存操作数的低字,DX保存操作数的高字,最后的结果是商放在AX中,余数放在DX中。
除法指令是状态标志没有意义,结果可能产生溢出,溢出时8086CPU中就产生编号为0的内部中断.实用中应该考虑这
个问题.
(4)有符号数的除法指令
指令格式如下:
IDIV OPRD
整个的操作过程和DIV一样,没有什么比较特殊的地方