x86汇编问题

3
我有两个简单但可能棘手的问题。假设我有汇编指令:MOV EAX,[ebx + 6 * 7] - 我好奇的是,这个指令是否真正地被转换为操作码,因此括号中的代码计算被编码为操作码,还是这只是编译器的伪指令,而不是CPU,因此编译器在使用add mul等计算出括号中的值后,将结果存储在某个寄存器中,然后使用MOV EAX,reg来使用计算出的值?只是为了明确,我知道输出将是相同的。我对执行感兴趣。
第二个问题是关于LEA指令的。我知道它的作用,但我更想知道它是否是真正的指令,所以编译器不会进一步更改它,只是按照原样将其转换为操作码,还是编译器只是将其视为伪代码,并首先计算地址,然后将其存储。
2个回答

5
汇编器(不是编译器,尽管它们非常相似)将计算出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

3

1)是的
2)是的

即它们两者都恰好翻译成操作码编码。

请记住,现代X86 CPU的基础架构与汇编器给你的期望非常不同。因此,仅仅因为它变成了单个指令并不意味着它会在处理器上被视作单个指令进行处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接