Max*_*ann 0 assembly definition inline-code
浏览x86汇编语言参考手册时,我遇到了一个立即操作数的定义:
操作数可以是立即的(即,评估为内联值的常量表达式),[...]
如果我正确地得到它,表达式返回一个值.难道一个常量表达式,然后返回一个恒定值?内联值是否意味着在经历了汇编过程后它会被其他一些值替换?
那么常量表达式会返回一个常量值吗?
是.立即操作数在操作码中创建一个常量值.就像mov eax, 3创建一个由几个字节组成的操作码 - 根据x32/x64英特尔手册.
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.
Run Code Online (Sandbox Code Playgroud)
例如:对于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
Run Code Online (Sandbox Code Playgroud)
B0h和B8h表示单字节操作码,C6h和C7h表示由操作码字节和编码寻址模式的Mod/RM字节组成的双字节操作码 - 在这种情况下indirect addressing.66h表示Operand-Size Prefix以下指令使用16位(地址模式外)操作数 - 与普通32位模式操作数相比的异常.8位操作数用另一个操作码编码.剩下的字节是8/16/32位值的编码3.
内联值是否意味着在经历了汇编过程后它会被其他一些值替换?
编号Assembl(y | ing)是将常量值合并到结果操作码中的过程(字节序列).在某种程度上,一切都是内联装配.