tl; dr 我遇到了一些不同的错误,具体取决于我如何尝试从x86-64程序集调用C _print
函数。我想通过调用C函数来打印它,所以我知道我可以调用C函数,但是我不确定如何进行“堆栈对齐”以使其正确发生。包括系统的完整源代码。
我尝试按照these的说明进行操作,但是我得到了:
Segmentation fault: 11
我的程序集看起来像这样:
section .text
global start
extern _print
start:
mov rdi, msg
jmp _print
section .data
msg: db 0xa, " Hello StackOverflow!!!", 0xa, 0xa, 0
.len: equ $ - msg
我的print.c
函数是这样的:
#import <stdio.h>
extern
void
print(char *str) {
puts("FOO");
puts(str);
}
我能够直接在C语言中使用print
函数,所以我知道这可行。所以我应该在输出中看到FOO
,但我只看到类似这样的内容,然后出现错误:
Hello StackOverflow!!@���
我这样编译C项目:
print:
@clang -I . -dynamiclib \
-O2 \
-undefined dynamic_lookup \
-o print.dylib print.c
.PHONY: print
我这样编译了asm项目:
asm:
@nasm -f macho64 main.asm
@ld -macosx_version_min 10.13.0 \
-lSystem -o main \
-install_name print.dylib \
main.o print.dylib
@./main
.PHONY: asm
我不明白如何将此堆栈框架/对齐概念应用于64位体系结构。
纠缠不清,我尝试将start
更改为此。我不知道为什么(不了解如何应用堆栈对齐):
start:
push rbx
mov rdi, msg
call _print
pop rbx
最终输出以下内容:
Hello StackOverflow!!@���make: *** [asm] Error 109
同样也没有打印出FOO
。