2010-05-15 160 views
3

我有2个简单的,但也许棘手的问题。假设我有汇编语言指令: MOV EAX,[ebx + 6 * 7] - 我很好奇的是,这个指令是否真的转化为操作码,因此括号中的代码计算被编码成操作码,或者这只是编译器的伪指令,而不是CPU,因此编译器在使用add mul计算括号内的值之前,将结果存储在某个reg中,并使用MOV EAX,reg与计算值?只是要清楚,我知道输出将是相同的。我对执行感兴趣。x86汇编程序问题

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

回答

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 
+0

49-2 = 47在我的书中 – 2010-05-16 12:48:35

3

1)是
2)是

即它们都完全转换为操作码编码。但是请记住,现代X86 CPU的底层架构与汇编器引导您期望的非常不同。所以仅仅因为它变成了单个指令并不意味着它将作为处理器上的单个指令被处理。