【问题标题】:x86 assembler questionx86 汇编程序问题
【发布时间】:2011-02-19 23:40:07
【问题描述】:

我有 2 个简单但可能很棘手的问题。假设我有汇编指令: MOV EAX,[ebx+6*7] - 我很好奇的是,这条指令是否真的按原样转换为操作码,所以括号中代码的计算被编码为操作码,或者这只是编译器的伪指令,而不是CPU,以便编译器之前使用 add mul 计算括号中的值等,将结果存储在某个 reg 中,然后使用 MOV EAX,reg 计算值?为了清楚起见,我知道输出将是相同的。我对执行感兴趣。

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

【问题讨论】:

    标签: assembly x86


    【解决方案1】:

    汇编器(不是编译器,虽然非常相似)会将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】:

      1) 是的
      2) 是

      即。它们都精确地转换为操作码编码。

      但请记住,现代 X86 CPU 的底层架构与汇编程序让您所期望的完全不同。因此,仅仅因为它变成一条指令并不意味着它会在处理器上作为一条指令进行处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-15
        • 2011-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多