如何解决什么是 REX 前缀是指令编码?
我的教授开始自相矛盾,所以我需要你的帮助。
在指令编码中,我们有一个可选的字段 REX 前缀,它是这样拆分的:
Field contains
0100 – fixed constant value
W – 1 when using 64-bit data
R – expands the Reg field to 4 bit
X – expands Index field to 4 bit
B – expands the R/M field or Base to 4 bit
我问我的教授“何时使用 64 位数据”真正意味着什么,每次我得到不同的答案:
-
使用添加到 x64 的新寄存器(如 r9、r10、r9d 等)时...
-
当使用 64 位寄存器时,如 rax、rbx、r9 等...
-
当指令使用(读/写)内存中的 64 位数据时。
我真的很困惑,正确答案是什么(这可能都不是,因为我不再信任我的教授了)。
解决方法
2 和 3。
例如,addq %rax,%rbx
、addq %rax,long_var
和 addq $123,long_var
都需要设置了 W 位的 REX 前缀,因为它们都有 64 位操作数大小。 addq %rax,%r9
需要 W 和 B,因为使用了“new”寄存器。
然而,addl %eax,%r9d
不需要 W 位,因为它的操作数大小是 32 位。它仍然需要B位来使用新的寄存器r9d
,所以仍然需要前缀字节,但不是因为“使用64位数据”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。