我有2个简单但也许棘手的问题。假设我有汇编指令: MOV EAX,[ebx + 6 * 7] - 我很好奇的是,这条指令实际上是否实际上转换为操作码,因此括号中的代码计算被编码为操作码,或者这只是编译器的伪指令,而不是CPU,以便编译器在使用add mul计算括号中的值之前,将结果存储在某些reg中,而不是使用MOV EAX,reg与计算值?为了清楚起见,我知道输出会是一样的。我对执行感兴趣。
其次是关于LEA指令。我知道它的作用,但是我对它的实际指令更感兴趣,因此编译不会进一步改变它,只是将其变为操作码,或者只是编译器的伪代码,再次首先计算地址而不是存储它。
答案 0 :(得分: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
答案 1 :(得分:3)
1)是
2)是的
即。它们都完全转换为操作码编码。
但请记住,现代X86 CPU的底层架构与汇编器引领您的期望非常不同。因为它成为单个指令并不意味着它将作为处理器上的单个指令进行处理。