代码之家  ›  专栏  ›  技术社区  ›  B.Gen.Jack.O.Neill

x86汇编程序问题

  •  3
  • B.Gen.Jack.O.Neill  · 技术社区  · 15 年前

    我有两个简单的,但可能是棘手的问题。假设我有汇编指令: mov eax,[ebx+6*7]-我想知道的是,这个指令真的按照它的状态转换为操作码吗,所以括号中的代码的计算被编码为操作码,或者这只是编译器的伪指令,而不是CPU,所以编译器在使用add mul计算括号中的值之前,将结果存储在一些reg中,而不是使用用计算值移动EAX、REG?只是说清楚,我知道输出是一样的。我对执行感兴趣。

    第二个是关于LEA指令。我知道它的作用,但我更感兴趣的是它的真正指令,所以编译不会进一步改变它,只是使它变成它所代表的操作码,或者只是编译器的伪代码,再次,首先计算地址,然后存储它。

    2 回复  |  直到 15 年前
        1
  •  5
  •   paxdiablo    15 年前

    汇编程序(不是编译器,尽管它非常相似)将计算出 6*7 位为42,则指令为:

    MOV EAX,[ebx+42]
    

    这是处理器通过添加 ebx 寄存器和常量42,然后使用该地址加载 eax . 没有将6和7编码为不同实体的指令,稍后再进行乘法运算。

    LEA 像其他任何指令一样是真实的。同样,汇编程序可以处理常量折叠(计算出固定值),以使汇编语句成为处理器的可用形式。

    您只需考虑以下说明:

    mov ax,1+1+1+1+1+1+1
    

    这不会被编码成某些(神奇的)字节序列 eb 01 01 01 01 01 01 01 ,其编码方式与以下任何一种完全相同:

    mov ax,7
    mov ax,49-42
    mov ax,42/6
    
        2
  •  3
  •   Goz    15 年前

    1)是的
    2)是的

    也就是说,它们都精确地翻译为操作码编码。

    不过,请记住,现代x86 CPU的底层架构与汇编程序引导您期望的非常不同。所以,仅仅因为它变成了一条指令,并不意味着它将作为处理器上的一条指令被处理。