我正在努力学习为64位Mac OS编写汇编语言.我对32位Mac OS以及32位和64位Linux没有任何问题.
但是,Mac OS 64位是不同的,我无法弄清楚.因此,我在这里寻求帮助.
我没有使用系统调用打印的问题.但是,我想学习如何使用Mac OS的64位汇编语言调用C函数.
请查看以下代码
.data
_hello:
.asciz "Hello, world\n"
.text
.globl _main
_main:
movq $0, %rax
movq _hello(%rip), %rdi
call _printf
Run Code Online (Sandbox Code Playgroud)
我使用$ gcc -arch x86_64 hello.s
组装和链接.
它生成二进制代码.但是,运行它时出现了分段错误.
我在调用_printf之前尝试添加"subq $ 8,%rsp",仍然和以前一样.
我做错了什么?
顺便说一下,这是在Mac上调试此代码的任何方法吗?我尝试添加-ggdb或-gstab或-gDWARF和$ gdb ./a.out,但无法查看代码并设置断点.
我用AT&T语法编写了一个程序,用于GNU汇编程序:
.data
format: .ascii "%d\n"
.text
.global main
main:
mov $format, %rbx
mov (%rbx), %rdi
mov $1, %rsi
call printf
ret
Run Code Online (Sandbox Code Playgroud)
我使用GCC来组装和链接:
gcc -o main main.s
我用这个命令运行它:
./主要
当我运行程序时,我得到一个seg错误.通过使用gdb,它说printf没有找到.我试过".extern printf",但是没有用.有人建议我应该printf在RET之前存储堆栈指针并在RET之前恢复,我该怎么做?