乘除运算指令

MUL

指令实现两个无符号操作数的乘法运算。

乘数是OPRD,被乘数位于AL、AX或EAX中(由OPRD的尺寸决定,乘数和被乘数的尺寸一致)。

乘积尺寸翻倍:16位乘积送到AX;32位乘积送DX:AX;64位乘积送EDX:EAX。 操作数OPRD可以通用寄存器,可以存储单元,但不能是立即数。

IMUL

有符号数乘法指令(sIgned MULtiply)

DIV

指令实现两个无符号操作数的除法运算。

除数 (OPRD) 大小被除数商存放位置余数存放位置计算公式
8位 (例如 BL)AX (16位)ALAHAX / OPRD
16位 (例如 BX)DX:AX (32位)AXDX(DX:AX) / OPRD
32位 (例如 EBX)EDX:EAX (64位)EAXEDX(EDX:EAX) / OPRD

商在AL、AX或者EAX中;余数在AH、DX或者EDX中(商和余数的尺寸与oprd相同)。 操作数OPRD可以是通用寄存器,可以是存储单元,但不能是立即数。

IDIV

指令实现两个有符号操作数的除法运算。

尺寸由除数OPRD决定。

操作数OPRD可以是通用寄存器,可以是存储单元,但不能是立即数

如果不能整除,余数的符号与被除数一致,而且余数的绝对值小于除数的绝对值。

符号扩展指令

指令把AL中的符号扩展到AH。

若AL的最高有效位为0,则AH=0;

若AL的最高有效位为1,则AH=FFH,也即AH的8位全都为1

指令把EAX中的符号扩展到EDX。

EAX的最高有效位为0,则EDX=0;

若EAX最高有效位为1,则EDX=FFFF FFFFH,也即EDX的32位全都为1。

指令把AX中的符号扩展到EAX的高16位。

AX的最高有效位为0,则EAX的高16位都为0;

若AX的最高有效位为1,则EAX的高16位都为1。

逻辑运算指令

处理器提供一组逻辑运算指令

否指令          NOT

按位取反

这是一个逻辑运算,而不是算术运算

最重要的“坑”:它不是求负数!

这是最需要理解的一点:NOT 指令不是求负数的指令!

求一个数的负数(二进制补码),正确的指令是 NEG

让我们对比一下:

指令操作例子 (EDX = 10)结果 (十进制)解释
NOT EDX按位取反NOT 10-11这是逻辑操作,不是算术操作。
NEG EDX求负数NEG 10-10这是算术操作,计算 0 - EDX

与指令          AND

AND EAX, 3 在功能上等价于 EAX % 4(计算 EAX 除以 4 的余数)

对EAX(设 1001)  和3(0011),每位对应相乘  ,结果(0001)

X % 2ⁿ 在功能上完全等价于 X & (2ⁿ - 1)

X % 4X & 3因为 4 是 2²,而 3 = 4 - 1 = (2² - 1)
X % 8X & 7因为 8 是 2³,而 7 = 8 - 1 = (2³ - 1)
X % 16X & 15因为 16 是 2⁴,而 15 = 16 - 1 = (2⁴ - 1)

或指令          OR

指令本身:OR ECX, EDX

  • 功能:这是按位或(Bitwise OR) 操作。

  • 操作:它将 ECX 寄存器的每一位与 EDX 寄存器的对应位进行“或”运算,并将结果存回 ECX 寄存器。

    • ECX = ECX | EDX

  • 规则:两位中只要有一位是1,结果就是1。

    • 0 OR 0 = 0

    • 0 OR 1 = 1

    • 1 OR 0 = 1

    • 1 OR 1 = 1

异或指令      XOR

测试指令(TEST)

移位指令

移位计数:所有用寄存器指定次数的移位/循环移位指令(SHLSHRSARROLRORRCLRCR),有且只能使用 CL 寄存器来存放移位次数。

一般移位指令

算术左移指令    SAL(Shift Arithmetic Left)

逻辑左移指令    SHL(SHift logic Left)

算术右移指令    SAR(Shift Arithmetic Right)

 对于 y >> 4 (右移)

这是关键所在!>> (右移) 的行为取决于 y 的类型:

  • 如果 y 是【无符号】类型 (例如 unsigned intuint32_t)

    • y >> 4 是 逻辑右移

    • 高位补 0

  • 如果 y 是【有符号】类型 (例如 intint32_t)

    • y >> 4 是 算术右移

    • 高位补 符号位(原来最高位的值,0或1)。这是为了保持负数的符号,实现“除以2的幂”的数学效果。

逻辑右移指令    SHR(SHift logic Right)

4者之间的比较

当右移两位(或更多位)时,情况略有不同。

核心规则依然不变:CF始终保存的是【最后一次】移位操作所移出的那个比特位。

这意味着,如果一条指令移位N位(N>1),CPU实际上是在内部执行了N次单步移位。而CF在每一步都会被覆盖,最终只保留最后一步(即第N次移位) 移出的那个位。

1. ADD EBX, 0

  • 操作EBX + 0,结果存回 EBX。这相当于一个 NOP(无操作),但它会根据结果设置标志位

  • 结果EBX 的值不变,仍是 7400EF9Ch (0111 0100 ...)。

  • 标志位分析

    • CF (进位标志): 加法没有产生最高位的进位,所以 CF = 0

    • ZF (零标志): 结果不是零,所以 ZF = 0

    • SF (符号标志): 结果的最高位是 0 (正数),所以 SF = 0

    • PF (奇偶标志): 计算结果的最低字节是 9Ch (1001 1100)。数其中 1 的个数:有 4 个 1(偶数个),所以 PF = 1

  • 你的注释是正确的


2. SHL EBX, 1

  • 操作:将 EBX 的所有位向左移动1位。最高位(MSB)被移入 CF,最低位(LSB)补 0

  • 计算前EBX = 0111 0100 0000 0000 1110 1111 1001 1100

  • 计算过程:

    1. 最高位 0 被移出,进入 CF

    2. 所有位左移一位。

    3. 最低位补 0

  • 计算后EBX = 1110 1000 0000 0001 1101 1111 0011 1000 (这就是 E801DF38h)

  • 标志位分析

    • CF: 被移出的最高位是 0,所以 CF = 0

    • ZF: 结果 E801DF38h 显然不是零,所以 ZF = 0

    • SF: 结果的最高位现在是 1(负数),所以 SF = 1

    • PF: 计算结果的最低字节是 38h (0011 1000)。数其中 1 的个数:有 3 个 1(奇数个),所以 PF = 0

  • 你的注释是正确的


3. MOV CL, 3 和 SHL EBX, CL

  • MOV CL, 3:这只是一个数据传送,不影响任何标志位

  • SHL EBX, CL:现在 CL = 3,所以这条指令将 EBX 逻辑左移3位

  • 计算前EBX = 1110 1000 0000 0001 1101 1111 0011 1000 (E801DF38h)

  • 计算过程:
    相当于左移1位,重复3次。我们关注最后一次(第3次)移位移出的位,它决定 CF

    1. 第一次左移:移出最高位 1 -> (临时CF=1), EBX变成 1101 0000 ...

    2. 第二次左移:移出新的最高位 1 -> (临时CF=1), EBX变成 1010 0000 ...

    3. 第三次左移:移出新的最高位 1 -> 这是最终决定CF的位CF = 1
      所有位左移3位后,最低3位补 000

  • 计算后EBX = 0100 0000 0000 1110 1111 1001 1100 0000 (这就是 400EF9C0h)

  • 标志位分析

    • CF: 如上所述,最后一次移位移出的位是 1,所以 CF = 1

    • ZF: 结果 400EF9C0h 不是零,所以 ZF = 0

    • SF: 结果的最高位现在是 0(正数),所以 SF = 0

    • PF: 计算结果的最低字节是 C0h (1100 0000)。数其中 1 的个数:有 2 个 1(偶数个),所以 PF = 1

循环移位指令

左循环移位指令    ROL(ROtate Left)

右循环移位指令    ROR(ROtate Right)

带进位左循环移位指令    RCL(Rotate Left through CF)

带进位右循环移位指令    RCR(Rotate Right through CF)

双精度移位指令

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95250.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95250.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95250.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Agentless:革命性的无代理软件工程方案

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 01. 什么是Agentless? Agentless是由伊利诺伊大学香槟分校…

CVE Push Service | 高危漏洞实时情报自动化推送工具

工具介绍 🔥 CVE Push Service | 自动化高危漏洞情报推送 ⚡ 面向网络安全从业者的 高危漏洞实时情报推送工具 自动拉取 NVD 最新漏洞数据,筛选 CVSS ≥ 7.0 的高危漏洞,并通过 Server酱3 第一时间推送到您的设备,帮助您在应急响…

SpringBoot的基础介绍,用法和配置

为什么会推出一款全新的SpringBoot?虽然Spring已经取得了非常大的成功,他的优点非常的多,将创建方法的权利给了Spring架构使我们程序员写代码更加的便利。但是Spring也有很多的缺点:配置麻烦,而且很多都是模板化的配置…

深度学习】--卷积神经网络

​​​​​​ 卷积神经网络 卷积神经网络(Convolutional Neural Network,简称CNN)是一种深度学习模型,特别适用于处理具有网格结构的数据。主要目的是自动地、层次化地从原始数据中学习有效的特征表示,以完成特定的任…

RK3588部署YOLOv8姿态估计

1. YOLOv8姿态估计与部署 姿态估计(Pose estimation)是一项涉及识别图像中关键点位置的任务。 关键点可以表示对象的各个部分,如关节、地标或其他独特特征,关键点的位置通常表示为一组2D[x, y]或3D[x, y, visible]坐标。 YOLOv8-Pose人体姿态估计,会先检测出图像中…

信创之-麒麟v10服务器安装tengine(已完成)

之前的文章太长了,所以单独写背景:java8springbootnginxredissqlserverwindows server2000目前java8已经更换,windows也已经更换,sqlserver也已经更换成dm8其实java的静态文件目录,可以很好处理前端网站了,…

Redis进阶(上)

Redis系统架构中各个处理模块是干什么的? Redis 系统架构 本课时,我将进一步分析 Redis 的系统架构,重点讲解 Redis 系统架构的事件处理机制、数据管理、功能扩展、系统扩展等内容。 事件处理机制 Redis 组件的系统架构如图所示,主…

【K8s】整体认识K8s之监控与升级/ETCD的备份和恢复/kustomization/CRD

metrics-server 先说一下metrics-server,这是一个聚合器,专门用来显示集群的资源使用情况,主要是内存和cpu。 安装 metrics-server kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.0/comp…

【数据分享】多份土地利用矢量shp数据分享-澳门

而今天要说明数据就是多份土地利用矢量shp数据分享-澳门。数据介绍▲ 土地利用数据(2025年)▲土地利用数据(2018年)▲ 30m土地利用数据(2023年)▲ 公路铁路道路河流水系数据概况其他概况注:本文…

增强现实—Gated-attention architectures for task-oriented language grounding

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

CC攻击的技术分析与防御策略

CC攻击(Challenge Collapsar Attack)是一种针对Web应用的拒绝服务攻击方式,其主要通过模拟正常用户行为来消耗服务器资源。为了更好地理解这种攻击,让我们详细分析其技术原理及防御策略。CC攻击的技术原理CC攻击主要是通过发送大量…

【图论】分层图

一、分层图的核心思想 分层图是一种将图的不同状态拆分为多个“层”的建模方法,每层对应一种特定状态。通过这种方式,可以将复杂的状态转移问题转化为多层图中的最短路径问题。 核心特点: 层内边:表示普通操作(如正常行…

当稳定币开始生息:USDT0 与 Berachain 的二次进化故事

如果说过去几年,稳定币是 DeFi 世界里最安稳的一块基石,那么 2025 年的 Berachain 正在把它们重新塑造成一种新的资产类型。在这条新兴的公链上,稳定币不再只是 “资金的搬运工”,而是摇身一变,成为能生息、能博弈、能…

Kafka、RabbitMQ 与 RocketMQ 在高并发场景下的高可用与性能对比分析

Kafka、RabbitMQ 与 RocketMQ 在高并发场景下的高可用与性能对比分析 消息队列作为分布式系统中常见的异步解耦组件,在高并发场景下对可用性和性能提出了极高的要求。本文基于生产环境需求,深入分析 Kafka、RabbitMQ 与 RocketMQ 三大主流消息中间件在高…

深入理解 HTTP 与 HTTPS:区别以及 HTTPS 加密原理

目录 一、HTTP 与 HTTPS 的基本概念 二、HTTP 与 HTTPS 的核心区别 三、为什么需要 HTTPS? 四、HTTPS 的加密通信原理(核心) 1. 客户端发起 HTTPS 请求 2. 服务端返回 SSL/TLS 证书 3. 客户端验证证书 4. 客户端生成对称密钥并用公钥…

零售行业的 AI 革命:从用户画像到智能供应链,如何让 “精准营销” 不再是口号?

AI 浪潮下的零售变革​在科技飞速发展的今天,人工智能(AI)正以前所未有的态势席卷全球,深刻地改变着各行各业的运营模式和发展轨迹,零售行业自然也难以置身事外。AI 技术凭借其强大的数据处理能力、精准的分析预测能力…

PyTorch 面试题及详细答案120题(96-105)-- 性能优化与调试

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 96. 如何查看PyTorch模型的…

Linux 孤儿进程 (Orphan Process)

🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录孤…

Linux Tun/Tap 多队列技术

🔥 Linux Tun/Tap 多队列技术 引用:Linux tun/tap 驱动多队列模式(C/C) 📖 引言 Tun/Tap 是 Linux 内核提供的虚拟网络设备,广泛应用于 VPN、虚拟化、网络隧道等领域。传统单队列模式在高吞吐量场景下存…

docker 启动一个clickhouse , docker 创建ck数据库

1. 拉镜像:docker pull clickhouse/clickhouse-server2. 创建容器并且启动命令:docker run -d --name clickhouse-server \-p 8123:8123 -p 9000:9000 \clickhouse/clickhouse-server3. 日志文件的映射,可以自己配置下,目前创建的…