内联值的定义
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 addressing
。 66h
指定一个 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)
浏览 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 addressing
。 66h
指定一个 Operand-Size Prefix
表示后续指令使用 16 位(超出地址模式)操作数 - 与正常的 32 位模式操作数相比是一个例外。一个 8 位操作数使用另一个操作码进行编码。剩下的字节是3
.
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)