如何在Mac上的x86-64 Assembly中调用C函数(堆栈对齐和/或Makefile构建问题)

时间:2019-03-22 21:16:56

标签: c assembly macros segmentation-fault nasm

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

0 个答案:

没有答案