内联值的定义

Definition of an inline value

浏览 x86 Assembly Language Reference Manual 时,我发现了 立即操作数 的定义:

Operands can be immediate (that is, constant expressions that evaluate to an inline value), [...]

如果我没记错的话,表达式 return 是一个值。 constant 表达式然后 return 是常量值吗? inline值是否意味着经过组装后会被其他值替代?

Does a constant expression then return a constant value?

是的。立即数操作数在操作码中创建一个常量值。像 mov eax, 3 创建一个由几个字节组成的操作码 - 根据 x32/x64 Intel Manual.

B0+ rb ib MOV r8, imm8 OI Valid Valid Move imm8 to r8.
B8+ rw iw MOV r16, imm16 OI Valid Valid Move imm16 to r16.
B8+ rd id MOV r32, imm32 OI Valid Valid Move imm32 to r32.
C6 /0 ib MOV r/m8, imm8 MI Valid Valid Move imm8 to r/m8.
C7 /0 iw MOV r/m16, imm16 MI Valid Valid Move imm16 to r/m16.
C7 /0 id MOV r/m32, imm32 MI Valid Valid Move imm32 to r/m32.

例如:对于 32 位模式,以下字节组合代表有效的操作码。这意味着 mov destination, 3 有几种可能性:

   b0 03                   mov    al, 3
66 b8 03 00                mov    ax, 3
   b8 03 00 00 00          mov    eax, 3
   c6 45 00 03             mov    byte  ptr [xxx], 3
66 c7 45 00 03 00          mov    word  ptr [xxx], 3
   c7 45 00 03 00 00 00    mov    dword ptr [xxx], 3

B0h 和 B8h 表示单字节操作码,C6h 和 C7h 表示由操作码字节和 Mod/RM-byte 编码寻址模式组成的两字节操作码 - 在本例中为 indirect addressing66h 指定一个 Operand-Size Prefix 表示后续指令使用 16 位(超出地址模式)操作数 - 与正常的 32 位模式操作数相比是一个例外。一个 8 位操作数使用另一个操作码进行编码。剩下的字节是3.

的8/16/32位值的编码

Does inline value mean that it will be substituted by some other value after having undergone the process of assembly?

没有。 Assembly(y|ing) 是将常量值合并到生成的操作码(字节序列)中的过程。在某种程度上,汇编中的一切都是内联的。

只是表示表达式必须是汇编时可以计算的值。常量表达式的示例包括:

5
5+5
5*5
MyConstant  (where this constant is defined somewhere else)
MyConstant*4

以上所有的值都可以由汇编程序确定并替换为表达式的值。

相比之下,非常量表达式具有无法在汇编期间确定的值。示例包括:

ah     (a register)
ah*al  (expression containing registers)
[0x800] (a memory location)