【发布时间】:2020-09-03 18:19:13
【问题描述】:
我从不认为是时候在这里问我的第一个问题了,但我来了。
作为我大学学习的一部分,我必须学习装配,而在互联网上搜索并没有找到我的问题的答案。 问题是当我尝试这个简单的代码时,我得到了段错误核心转储:
.text
hello_str:
.asciz "Hello, world!\n"
.global main
main:
movq %rsp, %rbp
movq $0, %rax
movq hello_str, %rdi
call printf
我使用 gcc -no-pie -o hello.o hello.s 然后 ./hello.o 评论调用 printf 使其运行,但没有输出(显然)。 问题是我做错了什么? 我的电脑在 64 位上运行,安装的是 Windows 10 操作系统,但我使用适用于 Linux 的 Windows 子系统来编译程序。
【问题讨论】:
-
即使使用 $hello_str 也会出现同样的错误
-
可能是堆栈对齐或调用约定问题...
-
确保第一个参数需要在 rdi 中传递,并检查这个答案:stackoverflow.com/questions/12678230/how-to-print-argv0-in-nasm/…
-
是的,确实如此。我发现了问题,我也会把它作为答案。我需要在开头输入: pushq %rbp
-
movq hello_str, %rdi是一个 qword 负载。也许您的意思是movq $hello_str, %rdi传递地址? (或者更好,lea hello_str(%rip), %rdi)。对齐堆栈不足以使此代码正常工作。另外,如果没有ret在通话后,这显然会崩溃。
标签: assembly gcc segmentation-fault