代码之家  ›  专栏  ›  技术社区  ›  Max Herrmann

内联值的定义

  •  0
  • Max Herrmann  · 技术社区  · 9 年前

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

    操作数可以是立即数(即计算为内联值的常量表达式)、[…]

    如果我理解正确,表达式将返回一个值。是否 常数 表达式然后返回一个常量值?做 在线 价值意味着在经历组装过程后,它将被其他价值取代?

    2 回复  |  直到 9 年前
        1
  •  5
  •   zx485 potemkin    9 年前

    常量表达式是否返回常量值?

    对立即数操作数在操作码中创建常量值。喜欢 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字节组成的两字节操作码-在这种情况下 indirect addressing . 66h 指定 Operand-Size Prefix 指示以下指令使用16位(地址外模式)操作数-与正常32位模式操作数相比,这是一个例外。8位操作数用另一个操作码编码。剩余的字节是8/16/32位值的编码 3 .

    内联值是否意味着在经历了组装过程后,它将被其他值替代?

    否。汇编(y|ing)是将常量值合并到结果操作码(字节序列)中的过程。在某种程度上,所有内容都是在程序集中内联的。

        2
  •  1
  •   Ville Krumlinde    9 年前

    这只是意味着表达式必须是一个可以在组装过程中计算的值。常量表达式的示例包括:

    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)