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

2023-11-15

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,这就意味着目的操作数的低半部分放不了整个乘积。

下述语句实现 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

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

 对于双操作数的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位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

x86汇编_MUL/IMUL乘法指令_笔记52 的相关文章

随机推荐

  • 网站流量统计

    常使用web服务器的朋友大都了解 一般的web server有两部分日志 一是运行中的日志 它主要记录运行的一些信息 尤其是一些异常错误日志信息 二是访问日志信息 它记录的访问的时间 IP 访问的资料等相关信息 现在我来和大家介绍一下利用t
  • 高级定时器 tim1 tim8 一般中断配置,以防以后忘记

    void Timer8 Init void TIM TimeBaseInitTypeDef TIM TimeBaseStructure NVIC InitTypeDef NVIC InitStructure RCC APB2PeriphCl
  • C++设计模式——单例模式 (一)

    单例模式 一个类只能创建一个对象 单例模式是C 中常用的一种设计模式 熟悉Qt的朋友肯定清楚QApplication实际也是采用的单例模式 并且为用户提供了一个全局的指针对象 qApp 我们先看看Qt中对于单例的实现 define qApp
  • Android NDK是什么

    官方给出的答案 Android NDK 是一套允许您使用原生代码语言 例如 C 和 C 实现部分应用的工具集 在开发某些类型应用时 这有助于您重复使用以这些语言编写的代码库 深入的学习 https developer android goo
  • 13 款炫酷的 MySQL 可视化管理工具!好用到爆!!

    MySQL 的管理维护工具非常多 除了系统自带的命令行管理工具之外 还有许多其他的图形化管理工具 工具好用是一方面 个人的使用习惯也很重要 这里介绍 13 款 MySQL 图形化管理工具 供大家参考 1 DBeaver DBeaver 是一
  • 分数运算(类+构造)

    题目描述 用C 定义和实现一个分数类 并根据要求完成分数对象的运用 分数类包含分子和分母两个属性 操作包括 各属性的get方法 构造函数 初始化分子分母 相加运算 该运算接收两个分数对象的分子和分母 然后进行分数相加 结果保存在自己的分子和
  • 利用 ViewBinding 和反射封装的基类,从此再也不用 findViewById 了

    code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者 段颖超丨乐拼链接 https www jianshu com p ea395a83c666声明 本文已获段颖超丨乐拼授权发表 转发等请联系原作者授权 今
  • 计算机图形学入门(一)-线性代数部分知识1

    本部分主要介绍了向量的点乘与叉乘在图形学中的基本应用 介绍了图形学中常用的2D矩阵变换 例如缩放 对称 切变换 旋转 平移 逆变换 组合变换和分解变换 还有在图形学中为了简化操作而采取的添加维度的方法 主要的学习过程来自下面的视频 本文只会
  • select case when语句

    今天看见一公司的数据库面试题 其中有道一开始没想起怎么做 后来摸索了下终于做出来了 题目是 两个表联合查询 当表2的记录在表A里没有时 将其设置为0 mysql gt select from t1 id name 1 bbs 2 bb 3
  • folly库安装(2)openssl升级、python3.8安装

    openssl是必须要升级到openssl1 1 1的 python3 8可以选择不安装 因为folly官网提供了一种用python3快速安装的方法 但这个方法在国内不太顺利 被墙的原因 很多包是不能自动下载的 但了解下也是好的 用pyth
  • 面试官:生成订单30分钟未支付,则自动取消,该怎么实现?

    了解需求 方案 1 数据库轮询 方案 2 JDK 的延迟队列 方案 3 时间轮算法 方案 4 redis 缓存 方案 5 使用消息队列 了解需求 在开发中 往往会遇到一些关于延时任务的需求 例如 生成订单 30 分钟未支付 则自动取消 生成
  • Centos下服务异常停止,log无任何异常体现localhost kernel: TCP: request_sock_TCP: Possible SYN flooding on port 8080

    背景 这两天项目出了奇怪的问题 某服务不明原因的停止运行 停止前一切正常 解决 重启服务解决 但不多久又出现类型问题 分析 开发和运维给不出原因 无法向客户交待 头大时刻想到系统运行日志 var log message应该有记录相应log
  • MySQL必知必会 学习笔记 第二十二章 使用视图

    MySQL 5添加了对视图的支持 视图是虚拟的表 它包含的是一个查询的结果 它本身不含数据 只是用来查看存储在别处的数据的一种设施 视图返回的数据是从其他表中检索出来的 在添加或更改这些表中的数据时 视图将返回改变过的数据 视图的应用 1
  • java数据结构基础名词解释

    第一章 绪论 数据与数据结构 数据 信息的载体 数据元素 数据中的一个 个体 是数据的基本组织单位 数据项 简单数据项 例如 姓名 年龄 组合数据项 例如 出生年月日 包含年 月 日三个简单数据项 数据对象 属性相同的数据元素的集合 数据结
  • 2022.11.29(面经五,笔试+技术面)

    2022 11 29 面经五 笔试题目不难 多刷力扣就成 1 什么是面向对象 面向对象 是把构成问题的事务分解成各个对象 而建立对象的目的也不是为了完成一个个步骤 而是为了描述某个事物在解决整个问题的过程中所发生的行为 附加 面向过程 分析
  • 【自我提高】树莓派GPIO的几种语言控制方法 C 篇

    使用C语言控制 GPIO 18 首先知道树莓派外置IO的关系对照表 我这里的树莓派是 PI 3B V1 2 关系对照表如下 C 语言下使用 wiringPi GPIO 进行编程 要安装 wiringPi pi raspberrypi sud
  • perl 入门推荐

    整理了一些perl链接 perl没有太多复杂概念 了解基础后 就可以编写各种需求脚本了 perl 相同功能 实现的方法有很多 只需了解最最基本的那种方法就好 剩下的就是百度 熟能生巧 举一反三 理解消化 perl语言 一个视频全解决 在线播
  • 合宙Air700E/4G模块使用AT指令查询基础信息

    Air700E使用AT指令查询基础信息 前言 AT指令使用 AT 确认AT固件 AT CGMR 请求制造商版本 AT CGMM 返回制造商型号编码 AT CGSN x 查询产品序列号 AT CGSN 1 查询IMEI AT CGSN 2 查
  • Flask项目(三)定义登录装饰器、图片服务、缓存机制、celery

    Flask项目 定义登录装饰器 redis文档 图片服务 封装七牛方法 城区数据下拉列表 缓存 用户认证相关 发布房源 map 函数 celery 基本使用 房屋管理 定义登录装饰器 utils commons py from werkze
  • x86汇编_MUL/IMUL乘法指令_笔记52

    32位模式下整数乘法可以实现32 16或8位的操作 64位下还可以使用64位操作数 MUL执行无符号乘法 IMUL执行有符号乘法 MUL指令 无符号数乘法 32 位模式下 MUL 无符号数乘法 指令有三种类型 执行 8 位操作数与 AL 寄