我一直遇到分段错误,我无法弄清问题是什么。这可能是非常愚蠢的事情。我刚刚开始学习装配,所以非常欢迎任何帮助和解释!
确切的错误是:分段错误(核心转储)
.text
mystr: .asciz "%d" #int that needs to be printed
.global main
main:
mov 5, %rsi
mov $mystr, %rdi
call printf
end:
mov $0, %rdi
call exit
答案 0 :(得分:0)
您的错误似乎是您在mystr
部分中分配了变量.text
。现在在汇编中,.text
保留给只读代码(适用于基本命令和诸如此类的东西,如果你写它就会导致分段错误)。你需要的是一个.data
部分,看起来像这样:
.text
.global main
main:
mov 5, %rsi
mov $mystr, %rdi
call printf
end:
mov $0, %rdi
call exit
.data
mystr: .asciz "%d" #int that needs to be printed
如果这不能按原样编译我很道歉(我精通另一种装配),但.data
部分是你缺少的部分。
答案 1 :(得分:0)
两个错误:
1)常量在AT& T-syntax中有前缀'$',因此你必须写mov $5, %esi
。
2)函数printf
需要x86-64
EAX
中的另一个参数,它告诉函数向量参数的数量(例如浮点数)。您没有矢量参数,因此请在xor %eax, %eax
- 行之前添加call printf
。