【发布时间】:2019-12-17 12:20:13
【问题描述】:
我已经开始组装了。
我不明白为什么我在 argc 之前有两个变量。
0000 和 0008 是什么?
global _main
section .text
_main:
; write
mov rax, 0x2000004
mov rdi, 0x1
mov rsi, [rsp+24]
mov rdx, 3
syscall
; return (0)
mov rax, 0x2000001
mov rdi, 0x0
syscall
我在 macOSX Mojave 上编译:
nasm -f macho64 ex01.s && ld -macosx_version_min 10.14 -lSystem ex01.o
【问题讨论】:
-
0000和0008是什么?您的
argv是一个指针数组,在最后一个参数之后带有一个标记NULL。argv始终包含可执行文件名称 (argv[0]),由于没有传递其他参数,argv[1]将是NULL。 -
见en.wikipedia.org/wiki/Crt0,它说明了
_start设置一些参数和调用_main。您可能会尝试查找在您的环境中使用的特定_start,以查看如何调用_main。我的猜测是 +0 是_start的返回地址。 -
不要发布终端输出的图片。相反,将此输出作为文本发布。
标签: macos assembly x86-64 callstack