【发布时间】:2021-01-28 01:39:20
【问题描述】:
试图缩小我的问题范围,以便我能够克服这个障碍。 This 对我帮助不大。
我正在运行 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
查看Intel Manuals,我转到添加部分,它显示如下:
80 /0 ib
看起来很接近,80 在那里,ib 是我的号码 2 即时值。但是如何从/0 中计算出这个c1?
文档说:
/digit — 0 到 7 之间的数字表示指令的 ModR/M 字节仅使用 r/m(寄存器或内存)操作数。 reg 字段包含提供指令操作码扩展的数字。
我的问题是:
- 为什么汇编器决定在这里放一个 ModR/M 字节?
- “仅使用 r/m(寄存器或内存)操作数”是什么意思?什么操作数,是说它承认有一个寄存器
cl和一个立即数2,所以它选择cl,因为它是一个寄存器? - “reg 字段包含提供指令操作码扩展的数字。”唔?这是什么意思?我只能从中收集到,
/0意味着它是第 0 个寄存器?但这行不通,似乎是错误的。 - 表 2-1 中有值
c1,它与“有效地址”标题下的cl寄存器对齐。虽然不知道那是什么意思。对应的 R/M 位就在001,它所在的列是0。虽然这些对我来说都没有多大意义。
我如何说服自己这个c1 字节是正确的?我如何阅读各种表格中的所有标志,我如何仅通过查看组件和 Intel 表格来自行推断?
【问题讨论】:
-
我应该链接How to determine if ModR/M is needed through Opcodes?,而不是x86_64 Opcode encoding formats in the intel manual。 vol.2 手册条目中的表格显示了哪个 asm 级操作数在机器代码的哪个部分精确编码。
-
回复:
/0:How to read the Intel Opcode notation 的重复项(我的回答专门针对/number的含义,而不是/r。)
标签: assembly x86 machine-code