这篇文章主要介绍了汇编语言MUL指令无符号数乘法的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
32 位模式下,MUL(无符号数乘法)指令有三种类型:
- 第一种执行 8 位操作数与 AL 寄存器的乘法;
- 第二种执行 16 位操作数与 AX 寄存器的乘法;
- 第三种执行 32 位操作数与 EAX 寄存器的乘法。
乘数和被乘数的大小必须保持一致,乘积的大小则是它们的一倍。这三种类型都可以使用寄存器和内存操作数,但不能使用立即数:
MUL reg/mem8
MUL reg/meml6
MUL reg/mem32
MUL 指令中的单操作数是乘数。下表按照乘数的大小,列出了默认的被乘数和乘积。由于目的操作数是被乘数和乘数大小的两倍,因此不会发生溢岀。
被乘数 | 乘数 | 乘积 |
---|---|---|
AL | reg/mem8 | AX |
AX | reg/mem16 | DX:AX |
EAX | reg/mem32 | EDX:EAX |
如果乘积的高半部分不为零,则 MUL 会把进位标志位和溢出标志位置 1。因为进位标志位常常用于无符号数的算术运算,在此我们也主要说明这种情况。例如,当 AX 乘以一个 16 位操作数时,乘积存放在 DX 和 AX 寄存器对中。其中,乘积的高 16 位存放在 DX,低 16 位存放在 AX。如果 DX 不等于零,则进位标志位置 1,这就意味着隐含的目的操作数的低半部分容纳不了整个乘积。
有个很好的理由要求在执行 MUL 后检查进位标志位,即,确认忽略乘积的高半部分是否安全。
MUL 示例
下述语句实现 AL 乘以 BL,乘积存放在 AX 中。由于 AH(乘积的高半部分)等于零,因此进位标志位被清除(CF=0):
mov al, 5h
mov bl, 10h
mul bl ; AX = 0050h, CF = 0
下图展示了寄存器内容的变化:
.data
val1 WORD 2000h
val2 WORD 0l00h
.code
mov ax, val1 ; AX = 2000h
mul val2 ; DX:AX = 00200000h, CF = 1
mov eax, 12345h
mov ebx, 1000h
mul ebx ; EDX:EAX = 0000000012345000h, CF = 0
下图展示了寄存器内容的变化:
mov rax, 0FFFF0000FFFF0000h
mov rbx, 2
mul rbx ; RDX:RAX = 0000000000000001FFFE0001FFFE0000
下面的例子中,RAX 乘以一个 64 位内存操作数。该寄存器的值乘以 16,因此,其中的每个十六进制数字都左移一位(一次移动 4 个二进制位就相当于乘以 16)。
.data
multiplier QWORD 10h
.code
mov rax, OAABBBBCCCCDDDDh
mul multiplier ; RDX:RAX = 00000000000000000AABBBBCCCCDDDDOh
到此这篇关于汇编语言MUL指令无符号数乘法的使用的文章就介绍到这了,更多相关汇编语言MUL指令内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:汇编语言MUL指令无符号数乘法的使用


- R语言-如何切换科学计数法和更换小数点位数 2022-11-23
- 汇编语言程序设计之根据输入改变屏幕颜色的代码 2023-07-06
- R语言绘图数据可视化pie chart饼图 2022-12-10
- Ruby的字符串与数组求最大值的相关问题讨论 2023-07-22
- Go Web开发进阶实战(gin框架) 2023-09-06
- Ruby 迭代器知识汇总 2023-07-23
- R语言关于二项分布知识点总结 2022-11-30
- Golang http.Client设置超时 2023-09-05
- Ruby on Rails在Ping ++ 平台实现支付 2023-07-22
- Swift超详细讲解指针 2023-07-08