汇编变量是如何实现的?
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。
我对如何在 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。