介绍
乘法指令分为无符号数乘法指令和有符号数乘法指令两种,它们唯一的区别是相乘的两个操作数是有符号数据还是无符号数据。 乘法指令的被乘数是隐含操作数,乘数需在指令中显式写出来。执行指令时,CPU会根据乘数是8位还是16位来自动选用被乘数是AL还是AX。
格式及功能介绍
无符号数乘法指令
指令格式:MUL opr 功能:将指令中指定的操作数与隐含的被乘数(都为无符号数)相乘,所得的乘积按表中的对应关系存放。
乘数位数 | 隐含的被乘数 | 乘积的存放位置 | 举例 |
---|---|---|---|
8位 | AL | AX中 | MUL BL |
16位 | AX | DX与AX中 | MUL BX |
MUL指令对标志位CF、OF有影响,对SF、ZF、AF、PF 无定义,如果运算结果的高一半(AH,DX)为零,则CF=OF=0,否则CF=OF=1。 注:
- 对标志位的“无定义”和“不影响”不同。无定义是指指令执行后,标志位的状态不确定;不影响是指指令的结果不影响标志位。即标志位保持原状态不变。
- MUL指令中的操作数可以使用除立即数以外的其他寻址方式,但当是寄存器时,操作器只能是通用寄存器。
有符号数乘法指令
指令格式:IMUL opr IMUL指令的格式和功能与MUL相同,只是要求两个操作数都须为有符号数。 IMUL指令对标志位的影响为:若乘积的高半部分是低半部分的符号位扩展,则OF=CF=0;否则OF=CF=1; 注:IMUL指令中对操作数的寻址的方式规定同MUL指令,但表示形式为补码,乘积也是以补码形式表示的数。
符号扩展及符号扩展语句
符号扩展
微机系统中,有时需要将一个数据从位数较少扩展到位数较多,例如,在执行除法指令时,由于对字节除数相除要求被除数为16位,对字除数要求被除数为32位,即被除数必须为除数的倍长数据,因此就涉及数据的位数扩展问题,具体的扩展有符号扩展与零扩展两种方法。
- 当要扩展的数据是无符号数时可采用零扩展。即在最高位前扩展0,补充够位数即可。
- 当要扩展的数据是有符号数时需采用符号扩展。由于采用补码形式表示的整数具有固定的长度,因此在汇编指令系统中,经常有一些指令需要将其中的操作数进行符号位扩展。譬如两个8位或16位数据进行相加或者相减运算时,当有不足位数要求的数据时,需要将少位数据扩展成与位数要求相一致的数据;两个数据相除时,被除数应必须是除数的倍数等。 符号扩展的方法是将需要扩展的数据的符号位填入到扩展的每一位,以保持其作为有符号数的值的大小不变。这里要注意,要扩展的数须是用补码形式表示的有符号数,符号扩展后。其结果仍是该数的补码。 因此,对于补码表示的数,其正数的符号扩展是将其符号位0向左扩展(补0);其负数的符号扩展是将其符号位1向左扩展(补1)。
符号扩展语句
- 字节扩展为字指令CBW 指令格式:CBW 功能:该指令的隐含操作数为AH和AL,功能是用AL的符号位去填充AH,即若AL为正数,则AH=00H;否则AH=FFH。
- 字扩展为双字指令CWD 指令格式:CWD 功能:该指令的隐含操作数为DX和AX,功能是用AX的符号位填充DX,即若AX为正数,则DX=0000H;否则DX=FFFFH。 以上两条指令的执行都不影响任何标志位。
例子
无符号相乘
代码语言:javascript复制1
可以看出来,无符号数相乘就是直接相乘即可。
有符号数相乘
代码语言:javascript复制1
这是本文的重点:
有符号数相乘,需要进行符号位扩展,符号位扩展详情在上面已经介绍过了。 有符号相乘的步骤:
- 符号位扩展(负数前面补1,正数补0)
- 扩展后的数据两式相乘
- 求补(计算机中存放的是补码)
- 取有效位,比如3位数据相乘,得到的结果取有效位6位即可。
有符号数相乘 例子:-3*3
- 在计算机中存放的时二进制数据补码,所以本例中应为101乘011
- 符号位扩展后 111101 X 000011 =10110111
- 取有效位6位 110111
- 求补 101001 可以计算出是-9,结果正确
题中数据计算
- 10110100 X 00010001
- 1111 1111 1011 0100 X 0000 0000 0001 0001
- 1111101011110100
- FAF4
后续
如果想了解更多物联网、智能家居项目知识,可以关注我的项目实战专栏。 欢迎关注公众号,喜欢就点一点 在看 。