为什么 `add cl, 2` 以 x86 十六进制打印 `80 c1 02`?

2023-12-31

试图缩小我的问题范围,以便我能够克服这个障碍。This https://stackoverflow.com/questions/28664856/how-to-interpret-x86-opcode-map?noredirect=1#comment116568309_28664856对我帮助不大。

我正在运行 NASM 来查看汇编的输出以十六进制表示。

test:
    @nasm -f macho64 test.asm
    @objdump -x86-asm-syntax=intel --full-leading-addr -d test.o
.PHONY: test

在那里我有一些东西,其中之一是:

add cl, 2

其输出为:

80 c1 02

看着英特尔手册 https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf,我转到 ADD 部分,它显示了以下内容:

80 /0 ib

看起来足够接近了,80在那里,并且ib是我的号码2即时价值。但如何计算这个c1来自/0?

文档说:

/digit— 0 到 7 之间的数字表示指令的 ModR/M 字节仅使用 r/m(寄存器或内存)操作数。这reg字段包含提供指令操作码扩展的数字。

我的问题是:

  1. 为什么汇编器决定在这里放置 ModR/M 字节?
  2. “仅使用 r/m(寄存器或内存)操作数”是什么意思?什么操作数,是说它认识到有一个寄存器cl并立即2,所以它选择cl因为它是一个寄存器?
  3. “reg 字段包含为指令的操作码提供扩展的数字。”唔?这是什么意思?我能从中收集到的就是,/0意思是它是第0个寄存器?但这不起作用,似乎是错误的。
  4. 表2-1有值c1其中,与cl在“有效地址”标题下注册。虽然不知道这意味着什么。相应的 R/M 位就在那里001,它所在的列是0。尽管这些对我来说还没有多大意义。

我如何说服自己这c1字节是否正确?我如何读取各个表中的所有符号,我如何自己通过查看汇编和英特尔表来推断出它?


  1. 因为Op/En为了80 /0 ib says MI这表示 Operand1 位于MODRM:r/m.
  2. 这意味着它仅使用 modr/m 的“r/m”部分,而不使用“reg”部分。
  3. 表示“reg”部分包含一个常量0作为操作码扩展。
  4. 你看一下 modr/m 表 2-2,它有一个标题行,上面写着“/digit (Opcode)”。所以你选择0列因为/0。然后选择ECX/CX/CL/MM1/XMM1行瞧,你得到了你的C1 value.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 `add cl, 2` 以 x86 十六进制打印 `80 c1 02`? 的相关文章

  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 这种没有推送寄存器的交换有多安全?

    我对汇编非常陌生 下面的代码应该通过两个不同的函数交换两个整数 首先使用swap c然后使用swap asm 但我怀疑 我是否需要push 我的意思是保存 汇编代码之前寄存器的每个值和pop稍后 就在返回之前 main 换句话说 如果我返回
  • 为什么我的代码显示垃圾?

    当我也想打印列表中的每个数字时 我的代码显示垃圾 有什么问题吗 输出应如下所示 给定的数组是 2G 4 PT为什么这是垃圾总数是 7 Code ASSUME CS CODE DS DATA SS STK ORG 0000H DATA SEG
  • 高效memcspn

    有谁知道 memcspn 函数的有效实现吗 它的行为应该类似于 strcspn 但在内存缓冲区中查找跨度 而不是在以 null 结尾的字符串中查找跨度 目标编译器是 VisualC 谢谢 卢卡 一种近乎最佳的实现 size t memcsp
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • 整数溢出问题

    我不断遇到整数溢出问题 我不知道如何解决它 有人可以帮忙吗 edx 包含 181 eax 包含 174 xor eax edx mov edx 2 div edx 假设你谈论的是x86 div edx这实际上没有意义 32位div将edx
  • Grub 和进入实模式(低级汇编语言编程)

    我一直在开发一个玩具操作系统 并一直使用 grub 作为我的引导加载程序 最近尝试使用 VGA 时 我发现无法使用硬件中断 我发现这是因为我被 grub 置于保护模式 有人知道如何在不删除 grub 的情况下回到实模式吗 如果您使用 GRU
  • 无法识别的仿真模式:MinGW32 上的 elf_i386

    我正在尝试制作内核 但无法链接C与程序集一起输出 这ld 我收到错误 无法识别的仿真模式 elf i386 我正在使用 Windows 10 专业版以及 MinGW32 和 MSYS 我正在使用的代码 link ld link ld OUT
  • CISC 机器 - 它们不只是将复杂指令转换为 RISC 吗?

    也许我在架构上存在误解 但如果机器有 比如说 乘法指令 该指令是否未转换为更小的指令 或者过于复杂以至于最终与等效的 RISC 指令具有相同的速度 乘法是一个不好的例子 它在两种体系结构中都是一条指令 将上面的 乘法 替换为 CISC 中更
  • _mm_max_ss 在 clang 和 gcc 之间有不同的行为

    我正在尝试使用 clang 和 gcc 交叉编译一个项目 但在使用时发现一些奇怪的差异 mm max ss e g m128 a mm set ss std numeric limits
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 一个地址有多少字节? [复制]

    这个问题在这里已经有答案了 在64位机器上 我们知道一个地址是8个字节 然而 我并不完全清楚一个地址中有多少字节的信息 虚拟内存中的每个字节都有一个地址吗 或者内存中的每 64 位都有一个地址 还是取决于架构 如果这取决于架构 那么我应该如
  • 无法在 64 位 Linux 上从汇编 (yasm) 代码调用 C 标准库函数

    我有一个函数foo以汇编语言编写 并在 Linux Ubuntu 64 位上使用 yasm 和 GCC 编译 它只是使用以下命令将消息打印到标准输出puts 如下所示 bits 64 extern puts global foo secti
  • 从 DX:AX 寄存器转移到单个 32 位寄存器

    我在添加 16 位乘法的乘积时遇到问题 我想将一年 例如 2015 年 乘以 365 为此 我 mov dx 0 to clear the register mov ax cx cx holds the year such as 2015
  • 在 x86 程序集中打印寄存器值的简单方法

    我需要在 8086 Assembly 中编写一个程序 接收来自用户的数据 进行一些数学计算并在屏幕上打印答案 我已经编写了程序的所有部分并且一切正常 但我不知道如何打印号码显示到屏幕上 在我所有计算结束时 答案是 AX 它被视为无符号 16
  • 64 位 Windows 汇编器

    我想对 64 位 Windows 程序集进行编程 最好使用 NASM 我在 google 上查了一下 但似乎找不到 64 位 Windows 编译器 有些网站提到了ml64 但它似乎不再包含在VC 中 我尝试过 32 位程序集 但显然它在我
  • 如何在 MacOS 上使用 nasm 进行编译

    我正在尝试在汇编器上编译并链接我的第一个程序 我尝试编译以下代码 include stud io inc global main section text main xor eax eax again PRINT Hello PUTCHAR
  • gcc 删除内联汇编代码

    看起来 gcc 4 6 2 删除了它认为函数中未使用的代码 test c int main void goto exit handler asm volatile jmp 0x0 exit return 0 拆解main 0x0804840

随机推荐

  • 在经典 ASP 脚本中使用 ADO.NET

    我正在编写一些返回单个值的简单查询 并且我想从经典 ASP 的 ADO 库中获取 ADO NET ExecuteScalar 方法的行为 但是 我不想重新发明轮子 是否可以在经典 ASP 中实例化 ADO NET 的 Command 对象
  • 码头工人。 MySQL 图像。无法更改 my.cnf 文件

    我有这样一个docker compose yml database container name test db image mysql 5 7 volumes docker my cnf etc my cnf environment MY
  • 如何检测 NSString 是否包含特定字符?

    我有一个 NSString 对象 例如 45 0000 现在我想知道这个字符串是否包含 我怎样才能做到这一点 您是否想查找它是否至少包含以下一项 or 您可以使用 rangeOfCharacterFromSet NSCharacterSet
  • 复制没有历史记录的 git 存储库

    我在 GitHub 上有一个私人存储库 我想将其公开 但是 一些初始提交包含我不想公开的信息 硬编码凭据等 在不包含部分或全部提交历史记录的情况下 公开最新提交 我真的不需要或不希望公共存储库中的先前提交 的最简单方法是什么 您可以限制历史
  • 如何在Web应用程序中使复选框只读

    我有一个网格视图 每一行都有一个复选框 当进入编辑模式时 可以选中 取消选中复选框 但我不希望该复选框在任何其他模式下都是可编辑的 用户可能很容易对不反映保存回数据库中的真实值的复选框感到困惑
  • 使用for循环批量重命名文件

    我正在尝试使用 for 循环来重命名文件 Echo Off setlocal enableDelayedExpansion Set Date set mydate DATE 10 4 DATE 4 2 DATE 7 2 Rename fil
  • 拆分逗号分隔的字符串并在 C# 中添加引号 - 优雅的解决方案

    我有一个string看起来像这样 var v 10 14 18 21 并想将其用作如下所示的东西 10 14 18 21 我写了一个函数 它将值分割为comma并将它们作为字符串添加在一起 另外我删除了最后一个 从结果字符串 我把所有东西都
  • DQL 返回实体数组而不是对象

    通常 如果我运行如下所示的 DQL 查询 它将返回实体对象列表 d this gt getDoctrine gt getRepository xxxWebsiteBundle Locations gt createQueryBuilder
  • 为什么用户可以设置新密码,而无需输入与我的批处理代码正确的旧密码?

    我最近写了一个文件夹锁定程序 我唯一的问题是当我需要更改密码时 例如我去部分newpass 该程序似乎不会将旧密码与新密码进行比较 而只是使用给定的任何输入 这违背了拥有密码的目的 因为每个人都可以更改密码 而不是用它解锁文件夹 有人可以仔
  • 在 Chrome 中重新加载动画 GIF 时出现问题

    我有一个可以重新加载 gif 动画的应用程序 它在 Safari 中始终有效 但在 Chrome 中时断时续 我相信这个问题与提到的问题类似here https groups google com forum topic shiny dis
  • Excel - 基于ID的工作表值查找[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有两张工作表 第一个列出了我的客户
  • 如何获取处理器和硬盘的制造序列号和 ID?

    如何使用 Matlab 获取以下硬件属性 主板制造序列号 处理器 ID 处理器制造序列号 硬盘ID 硬盘制造序列号 是否有任何函数或类负责检测其他机器硬件组件属性的属性 我知道可以使用系统或控制台命令来完成 但我不知道如何完成 不过 我更喜
  • 将 1 亿个文件写入 s3

    我的主要目标是根据每条记录的 id 将记录拆分为文件 目前有超过 150 亿条记录 而且肯定还会增加 我需要一个使用 Amazon EMR 的可扩展解决方案 我已经为一个包含大约 9 亿条记录的较小数据集完成了这项工作 输入文件采用 csv
  • Gensim LDA 中的主题明智文档分布

    python 有没有办法映射属于某个主题的文档 例如 主要是 主题 0 的文档列表 我知道有多种方法可以列出每个文档的主题 但我该如何反过来呢 Edit 我正在使用以下 LDA 脚本 doc set for file in files ne
  • 如何在 Visual Studio 2010 中构建这个简单的 C++/SWIG/C# 项目?

    我需要帮助设置一个简单的 C C SWIG 项目 我很难将使用 SWIG 绑定的 C 项目组合在一起 我正在使用 Visual Studio 2010 和最新版本的 SWIG 我的代码很简单 cpp 文件 h pragma once cla
  • 是否有任何方便的代码覆盖率工具可与 JUnit 一起使用?

    是否有方便的代码覆盖率工具可与 JUnit 一起使用 我想大多数代码覆盖率工具都可以很容易地与 JUnit 一起使用 以前我用过EMMA http emma sourceforge net 这很好 如果您是 Eclipse 用户 有一个 E
  • 如何以编程方式清空浏览器缓存?

    我正在寻找一种以编程方式清空浏览器缓存的方法 我这样做是因为应用程序会缓存机密数据 并且我想在您按 注销 时删除这些数据 这可以通过服务器或 JavaScript 发生 当然 仍然不鼓励在外国 公共计算机上使用该软件 因为存在更多危险 例如
  • 如何在 Mongoose 中验证数组及其元素

    我有这个模式 我在其中验证了数组的元素book 但我不知道如何验证数组本身 var DictionarySchema new Schema book 1 type String required true 2 String 3 String
  • 我可以从运行时加载的共享对象访问主机进程的符号吗?还有其他选择吗?

    在我的场景中 我想要一个插件 它是在运行时加载的共享对象 用于访问 主机应用程序 中的符号 以便我可以向我的应用程序添加任何功能 我已经尝试过 但没有找到任何方法来做到这一点 而且我不知道这是否可能 那么 我可以以某种方式做到这一点 或者使
  • 为什么 `add cl, 2` 以 x86 十六进制打印 `80 c1 02`?

    试图缩小我的问题范围 以便我能够克服这个障碍 This https stackoverflow com questions 28664856 how to interpret x86 opcode map noredirect 1 comm