我有2个简单但也许棘手的问题.假设我有汇编指令:MOV EAX,[ebx + 6*7] - 我很好奇的是,这条指令实际上是否实际转换为操作码,因此括号中的代码计算被编码为操作码,或者这只是编译器的伪指令,而不是CPU,所以编译器在使用add mul计算括号中的值之前,在某些reg中存储结果,而不是使用MOV EAX,reg与计算值?为了清楚起见,我知道输出会是一样的.我对执行感兴趣.
其次是关于LEA指令.我知道它的作用,但是我对它的实际指令更感兴趣,因此编译不会进一步改变它,只是将其变为操作码,或者只是编译器的伪代码,再次首先计算地址而不是存储它.
汇编程序(不是编译器,虽然它非常相似)将该6*7位计算为42,然后指令为:
MOV EAX,[ebx+42]
Run Code Online (Sandbox Code Playgroud)
这是处理器可以执行的,通过添加ebx寄存器和常量42的内容,然后使用该地址加载eax.没有指令将6和7编码为不同的实体,以后再相乘.
LEA就像任何其他的一样真实.同样,汇编程序可以处理常量折叠(计算固定值)以将汇编语句转换为处理器的可用形式.
你只需要考虑这个指令:
mov ax,1+1+1+1+1+1+1
Run Code Online (Sandbox Code Playgroud)
这不会被编码为某些(神奇的)字节序列eb 01 01 01 01 01 01 01,它将被编码为与以下任何一个完全相同的编码:
mov ax,7
mov ax,49-42
mov ax,42/6
Run Code Online (Sandbox Code Playgroud)