x86汇编_MUL/IMUL乘法指令_笔记52

这篇具有很好参考价值的文章主要介绍了x86汇编_MUL/IMUL乘法指令_笔记52。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

32位模式下整数乘法可以实现32、16或8位的操作,64位下还可以使用64位操作数。MUL执行无符号乘法,IMUL执行有符号乘法。

MUL指令:无符号数乘法

32 位模式下,MUL(无符号数乘法)指令有三种类型:

  • 执行 8 位操作数与 AL 寄存器的乘法;
  • 执行 16 位操作数与 AX 寄存器的乘法;
  • 执行 32 位操作数与 EAX 寄存器的乘法。

MUL 指令中的单操作数是乘数。下表按照乘数的大小,列出了默认的被乘数和乘积。由于目的操作数是被乘数和乘数大小的两倍,因此不会发生溢岀,换句话说,两个8位二进制数的乘积不会超过16位

MUL无符号指令
被乘数 乘数 乘积存放位置 备注
AL reg8/mem8 AX MUL操作数是8位寄存器,自动将AL当作被乘数。结果存放AX。
AX reg16/mem16 DX:AX MUL操作数是16位寄存器,自动将AX当作被乘数。结果的低位放在AX,高位在DX。
EAX reg16/mem32 EDX:EAX MUL操作数是32位寄存器,自动将EAX当作被乘数。结果的低位在EAX,高位在EDX。

如果乘积的高半部分不为零,则 MUL 会把进位标志位和溢出标志位置 1。因为进位标志位常常用于无符号数的算术运算,在此我们也主要说明这种情况。例如,当 AX 乘以一个 16 位操作数时,乘积存放在 DX 和 AX 寄存器对中。其中,乘积的高 16 位存放在 DX,低 16 位存放在 AX。如果 DX 不等于零,则进位标志位置 1,这就意味着目的操作数的低半部分放不了整个乘积。

x86汇编_MUL/IMUL乘法指令_笔记52

下述语句实现 16 位值 2000h 乘以 0100h。由于乘积的高半部分(存放于 DX)不等于零,因此进位标志位被置 1。注意,CF是1仅代表DX寄存器不为0,不是说DX和AX两个寄存不够存放结果

.data
val1 WORD 2000h
val2 WORD 0l00h

.code
mov ax, val1           ; AX = 2000h
mul val2               ; DX:AX = 00200000h, CF = 1

x86汇编_MUL/IMUL乘法指令_笔记52

IMUL指令:有符号数乘法

与 MUL 指令不同,IMUL 会保留乘积的符号,但两个有符号8位数的乘积仍然不超过16位,不会因为有符号问题就超过16位。x86 指令集支持三种格式的 IMUL 指令:单操作数、双操作数和三操作数,而无符号的MUL指令只有单操作数。

对于单操作数的IMUL指令,规则同无符号的MUL。和 MUL 指令一样,其乘积的存储大小使得溢出不会发生。同时,如果乘积的高半部分不是其低半部分的符号扩展,则进位标志位和溢出标志位置 1。利用这个特点可以决定是否忽略乘积的高半部分。

IMUL有符号指令单操作数的规则
被乘数 乘数 乘积存放位置
AL reg/mem8 AX
AX reg/mem16 DX:AX
EAX reg/mem32 EDX:EAX

x86汇编_MUL/IMUL乘法指令_笔记52

x86汇编_MUL/IMUL乘法指令_笔记52

x86汇编_MUL/IMUL乘法指令_笔记52 对于双操作数的IMUL指令,用第一个操作数乘以第二个操作,将结果存放到第一个操作所在的寄存器。第一操作数必须是16或32位寄存器,第二操作可以是16或32位内存或寄存器,位数与第一操作数对应。第二操作数还可以是8位立即数且只能是8位的。双操作数格式会按照目的操作数的大小来截取乘积,乘积的高半部分会被丢弃。如果被丢弃的是有效位,则溢出标志位和进位标志位置 1。因此,在执行了有两个操作数的 IMUL 操作后,必须检查这些标志位中的一个。

下述指令展示了双操作数格式:

.data
word1 SWORD 4     ;16位内存
dword1 SDWORD 4   ;32位内存
.code
mov ax, -16            ; AX = -16
mov bx, 2              ; BX = 2
imul bx, ax            ; BX = -32
imul bx, 2             ; BX = -64
imul bx, word1         ; BX = -256
mov eax, -16           ; EAX = -16
mov ebx, 2             ; EBX = 2
imul ebx, eax          ; EBX = -32
imul ebx, 2            ; EBX = -64
imul ebx, dword1       ; EBX = -256

对于三操作数的IMUL指令,第二和三个操作数的乘积存放到第一操作数中,第三操作数必须是立即数。若乘积有效位被丢弃,则溢出标志位和进位标志位置 1。因此,在执行了有三个操作数的 IMUL 操作后,必须检查这些标志位中的一个。格式如下:

imul 16位寄存器,16位寄存器或者内存,8或16位立即数

imul 32位寄存器,32位寄存器或者内存,8或32位立即数

下面的指令展示的是三操作数格式,包括了有符号溢出的例子:

.data
word1 SWORD 4
dword1 SDWORD 4
.code
imul bx, word1, -16             ; BX = word1 * -16
imul ebx, dword1, -16           ; EBX = dword1 * -16
imul ebx, dword1, -2000000000   ; 有符号溢出!此时需要40个位才足够存放结果,而ebx只有32位。

x86汇编_MUL/IMUL乘法指令_笔记52文章来源地址https://www.toymoban.com/news/detail-469791.html

到了这里,关于x86汇编_MUL/IMUL乘法指令_笔记52的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • x86平台SIMD编程入门(4):整型指令

    算术类型 函数示例 加 _mm_add_epi32 、 _mm256_sub_epi16 减 _mm_sub_epi32 、 _mm256_sub_epi16 乘 _mm_mul_epi32 、 _mm_mullo_epi32 除 无 水平加/减 _mm_hadd_epi16 、 _mm256_hsub_epi32 饱和加/减 _mm_adds_epi8 、 _mm256_subs_epi16 最大/最小值 _mm_max_epu8 、 _mm256_min_epi32 绝对值 _mm_abs_epi16 、 _mm256_abs_epi32 平均值 _mm

    2024年02月06日
    浏览(30)
  • 发布 VectorTraits v2.0(支持 x86的Sse系列指令集等)

    目录 支持 x86的Sse系列指令集 为 Vector128/Vector256 补充全部的向量方法 提供CPU型号信息 结果范例1: X86 CPU on Windows 结果范例2: Arm CPU on Linux 结果范例3: Arm CPU on Mac OS 提供所支持的指令集信息 结果范例1: X86 CPU on Windows 结果范例2: Arm CPU on Linux 结果范例3: Arm CPU on Mac OS 新增了向量方

    2024年03月17日
    浏览(28)
  • 【架构】探索计算机处理器的世界:ARM和x86架构解析及指令集

    计算机处理器是数字化时代的核心引擎,而在众多处理器架构中,ARM和x86是备受关注的三个。本文将带您深入探索这三个架构,介绍它们的特点、公司背景以及应用领域。让我们一起揭开计算机处理器的神秘面纱吧! ARM(Advanced RISC Machines)是一种计算机指令集架构(ISA),

    2024年02月11日
    浏览(35)
  • C语言代码的x86-64汇编指令分析过程记录

    先通过Xcode创建一个terminal APP,语言选择C。代码如下: 在return 0处打上断点,并且Xcode菜单里选择Debug|Debug Workflow|Always Show Disassembly,点击运行。这时候断点会跳到汇编代码里,得到汇编代码如下: 首先介绍下面会用到的几个寄存器: rip : 程序计数寄存器 rsp : 栈指针寄存器

    2024年02月14日
    浏览(26)
  • FPGA HLS Matrix_MUL 矩阵乘法的计算与优化

    设置clock,10表示一个周期10ns,带宽100M vivado工具比较保守,计算需要的延迟是14,实际优化可以在10,设置大一点,优化的计算更多,一般约束设置大一点在30-50 选择开发板 xc7z020clg400-1 Source:描述功能模块的cpp和h代码 Test Bench:测试代码的 main.cpp matrix_mul.h #ifndef __xxxx__ #def

    2024年02月09日
    浏览(31)
  • x86 32 64 Arm这些听过但不懂,都是什么?是架构还是系统?一文梳理

    x86 听过吗? 64位操作系统知道吧 和x86什么关系 32和64都是什么东西? 曾经的我也一头雾水,今天我才来整理一下,惭愧惭愧! 今天带着沉重的心情来梳理一下学习内容吧 如果你很熟悉很了解计算机的话,应该知道,处理器、操作系统、驱动、软件都有32位和64位之分,只不

    2024年04月29日
    浏览(45)
  • 【汇编】32位汇编常用的指令

    目录 1、普通指令        mov:传送字或字节        add:加法        sub:减法        inc:加1        dec:减1         and:与运算,都为1才为1        or:或运算,都为0才为0        xor:异或运算,多用于加密解密,相同为0不同为1        not:按位取反,单目运算

    2024年02月02日
    浏览(29)
  • 虚拟现实项目笔记:SDK、Assimp、DirectX Sample Browser、X86和X64

    SDK是Software Development Kit的英文缩写,意思是软件开发包。 软件开发包中往往包含有多种辅助进行软件开发的内容,包括一些软件开发工具、文档说明、库和示例代码。这些内容能够帮助使用SDK进行软件开发的人员更好地开发程序。 SDK的作用就是简化软件开发过程并对特定的

    2024年02月08日
    浏览(31)
  • arm 32 常见汇编指令解释

    push: 将一个或多个寄存器的值压入栈中,更新栈指针寄存器。语法示例:push {r1, r2, r3}。 add: 执行加法并将结果存储到目标操作数中。语法示例:add r1, r2, #5,将寄存器r2的值加上5,结果存储到寄存器r1中。 push.w: 将指定的寄存器的值压入栈中,并将栈指针向下调整4个字节。语

    2024年02月06日
    浏览(32)
  • pytorch中的矩阵乘法操作:torch.mm(), torch.bmm(), torch.mul()和*, torch.dot(), torch.mv(), @, torch.matmul()

    😄 无聊整理下torch里的张量的各种乘法相关操作。 1、让所有输入张量都向其中shape最长的矩阵看齐,shape不足的部分在前面加1补齐。 2、两个张量的维度要么在某一个维度一致,若不一致其中一个维度为1也可广播。否则不能广播。【如两个维度:(4, 1, 4)和(2, 1)可以广播,因

    2024年02月04日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包