汇编变量是如何实现的?

How are assembly variables implemented?

我对如何在 Assembly 中实现变量感到有点困惑。我知道以下声明在程序的 data 部分中创建了一个命名的内存位置:

.section .data
        var:
                .long 23

然后就可以访问变量如:

movl var, %eax //read from var location

我不清楚上面的指令是如何实际执行的。我的印象是内存引用,即使是绝对内存引用,也需要先加载到寄存器中才能使用。

汇编器是否需要将上述指令转换为多条指令,如:

leal var, %ebx
movl (%ebx), %eax

或者汇编程序是否跟踪 var 的地址并访问该位置,就好像它是绝对立即访问一样,例如:

movl ($addr_of_var), %eax

x86 指令集不需要在使用前将内存地址加载到寄存器中——几乎所有指令都可以在指令中使用直接或间接内存引用。有关详细信息,请参阅 Intel architecture manual

首先将地址加载到寄存器的要求是某些 RISC cpu 的特征,例如 MIPS。