assembly - 汇编变量是如何实现的?

标签 assembly x86 gnu-assembler

我对 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 - 汇编变量是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39969625/

相关文章:

assembly - 从 IRQ 处理程序获取返回地址?

linux - 为什么我们不能使用 esp 寄存器直接引用内存地址?

assembly - 不支持的指令 `lidt`

linux - 从汇编程序获取命令行参数

assembly - 气体 : jmp to label results in wrong jump?

assembly - 如何在 8080 上高效地进行签名比较?

assembly - x86 指令集路线图

assembly - 如何在 NASM 中编写 'Hello_world' EFI 应用程序?

x86 - 有没有办法在 gdb 中操作零标志?

assembly - 加载引导加载程序的第二阶段并启动它