【问题标题】:How are assembly variables implemented?汇编变量是如何实现的?
【发布时间】:2016-10-11 02:27:39
【问题描述】:

我对如何在 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

【问题讨论】:

  • 没有。你对要求有误解。您不必将地址加载到寄存器中。查看MOV 系列指令的指令参考。

标签: assembly x86 gnu-assembler


【解决方案1】:

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

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

【讨论】:

  • 谢谢!上面的第二个说法准确吗? (汇编器是否跟踪变量的绝对引用?)
  • @David:汇编程序通常以符号方式处理符号引用,由链接器确定所有内容的最终位置,并根据需要修复代码。
猜你喜欢
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多