为啥在 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 程序集中将复制变量地址移动到寄存器?的主要内容,如果未能解决你的问题,请参考以下文章