【发布时间】:2019-11-21 07:00:20
【问题描述】:
我一直在尝试使用 NASM 在 Mac-OS 和 Windows 上学习 64 位汇编。
我的代码是
extern _printf
section .data
msg db "Hello World!", 10, 0
section .text
global _main
_main:
mov rax, 0
mov rdi, msg
call _printf
mov rax, 0x2000001
mov rdi, 0
syscall
我用它编译它
nasm -f macho64 -o main.o main.asm
gcc -o main main.o
在尝试调用_printf 时,我收到了错误
分段错误:11
当我删除对_printf 的调用时,我的代码运行良好。
为什么调用_printf 会导致分段错误?
我找到了 ABI 调用约定 here,但没有成功调用 C 函数。
我希望 Hello World! 被打印出来,但是我得到的是“Segmentation Fault: 11”。
【问题讨论】:
-
您确定
mov rdi, msg被编码为mov r64, imm64而不是mov r/m64, imm32?尝试改用mov rdi, qword msg。 -
您可能会尝试在 C 中调用该函数并查看创建的汇编程序输出。
-
@Michael 我换行了,输出没变。
-
@Gerhardh 我之前尝试过这样做,但是除了非常基本的内容之外,我很难理解其中的大部分内容,尤其是因为语法不同。
标签: c assembly x86-64 nasm mach-o