【问题标题】:Encoding 8-bit operand size? Is there a prefix for that like for 16-bit?编码 8 位操作数大小?是否有类似 16 位的前缀?
【发布时间】:2021-07-31 17:54:06
【问题描述】:

在指令编码中默认大小为:

operand size is 32 bit
address size is 64 bit 

我们可以使用 legacy 前缀:

0x66 – Operand-size override prefix

使操作数大小为 16。如果我想将其设为 8 位而不是 16 位怎么办?

【问题讨论】:

  • 请不要试图将多个问题合二为一来规避问题限制。用户因此而被暂停。
  • 你的一个同学几天前已经因为同样的事情被停学了,所以要认真对待。至于你的问题:8位指令有单独的操作码。
  • 要了解更多信息,请尝试自己组装和拆卸大量示例,并与wiki.osdev.org/X86-64_Instruction_Encoding等表格进行比较。
  • 就这一次:movl $1234, 64(%rax, %rbx, 4)$1234 是立即数,64 是位移,%rax 基数,%rbx 索引,4 刻度。
  • Is there a default operand size in the x86-64 (AMD64) architecture? 涵盖了这一点,但这是一个更广泛的问题。尽管如此,它仍然是我的site:stackoverflow.com x86 8-bit operand size opcode prefix 搜索的第三次点击。

标签: assembly x86-64 machine-code instructions instruction-encoding


【解决方案1】:

如果我想让它变成 8 位而不是 16 位怎么办?

你不能用前缀来做到这一点。支持 8 位操作数大小的指令使用完全独立的操作码,而不是覆盖前缀。

例如:

   0:   01 d9                   addl    %ebx,%ecx
   2:   66 01 d9                addw    %bx,%cx
   5:   00 d9                   addb    %bl,%cl

32 位的add 是操作码01,mod/rm 字节为d9。 16 位加法相同,但带有 66 操作数大小前缀。但是 8 位加法是操作码 00

对此的解释是历史性的。 16 位 8086 CPU 支持 8 位和 16 位操作数,并为两者使用单独的操作码:00 用于 addb01 用于 addw。 (这仍然是您在实模式下运行现代芯片时得到的结果,例如在引导扇区中。)32 位 80386 想要添加 32 位操作数,同时仍支持 8 位和 16 位,但没有空间更多的操作码,因此对于 32 位保护模式,他们将所有以前的 16 位指令改为 32 位,并且可以覆盖以返回 16 位,并且他们只保留了 8 位指令。 (在实模式下,操作数大小覆盖具有相反的效果:01addw66 01addl。)

【讨论】:

猜你喜欢
  • 2012-10-21
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 2020-09-12
  • 1970-01-01
  • 2022-10-24
相关资源
最近更新 更多