为啥在 x64 程序集中将复制变量地址移动到寄存器?

Posted

技术标签:

【中文标题】为啥在 x64 程序集中将复制变量地址移动到寄存器?【英文标题】:Why does move copy variable address to register, in x64 assembly?为什么在 x64 程序集中将复制变量地址移动到寄存器? 【发布时间】:2014-01-08 21:48:14 【问题描述】:

我使用 AT&T 语法在 x64 汇编中编写了一个程序,但我不明白为什么 mov 运算符将地址变量复制到寄存器。这是我的代码:

        .globl main

        .text
main:
    mov    $a, %rax

    mov     $format, %rdi           # set 1st parameter (format)
    mov     %rax, %rsi              # set 2nd parameter (current_number)
    mov     $0, %rax                # because printf is varargs

    sub     $8, %rsp                # align stack pointer
    call    printf                  # printf(format, sum/count)
    add     $8, %rsp                # restore stack pointer

    ret

        .data
a:      .quad   123
format: .asciz  "%d\n"

程序输出 6295616 而不是 123。请帮助我理解我做错了什么。

【问题讨论】:

我以前试过这个,但我得到:“错误:无效字符'['开始操作数1 `[$a]'”。 @SevaAlekseyev:mov a(%rip), %rax 是首选。但绝对不是英特尔和 AT&T 语法的混合。您可能想删除该旧评论。 【参考方案1】:

因为你已经用美元符号表示你想要立即模式。删除它以获得绝对模式。

【讨论】:

当我删除美元符号时,我收到此错误:“错误:无效字符 '[' 开始操作数 1 `[a]'”。我也试过写“$[a]”,结果和“$a”一样。 谢谢詹斯!它适用于简单的变量名“a”,没有美元符号。

以上是关于为啥在 x64 程序集中将复制变量地址移动到寄存器?的主要内容,如果未能解决你的问题,请参考以下文章

x64:为啥这段代码给我“地址边界错误”

在 ARM Neon 程序集中使用 C 变量

在 X86 程序集中访问和移动字节

嵌入式系统中的存储器映射是怎么回事,为啥要映射

Flash与S3C44B0X连接时地址线为啥要偏移一位

错误 C2403 使用内联 x86 C++ 程序集将寄存器内容移动到变量