我在 Linux x86_64 系统上,我的目标是在经典的 main 函数中创建一个汇编程序。我已经尝试过了,效果很好:
.code64
.section .rodata
msg: .ascii "Hello, World!\n"
.set msglen, (. - msg)
.section .text
.global _start
_start:
mov $1, %rax
mov $1, %rdi
lea msg, %rsi
mov $msglen, %rdx
syscall
mov $60, %rax
mov $0, %rdi
syscall
我用“as -o hello.o -s hello.s”编译了它,然后与“ld -o hello hello.o”链接
但是我希望我的程序位于 main 函数内,并分别使用“as main.s (... options ) -o main.o”和“gcc main.o (...options) -o 进行编译和链接主要的”。 我怎样才能做到这一点?
将
_start
更改为 main
,并使用 lea msg(%rip), %rsi
,这样您的代码就不会使用任何 32 位绝对地址(并且与位置无关)
您还可以用
ret
替换退出系统调用。由于您不需要进行任何库函数调用或出于任何其他原因移动堆栈指针,因此它仍然指向返回地址。
如果您使用
gcc
,则不需要单独组装,您可以让它为您运行汇编器,例如gcc -c main.S
,然后链接,或者只是gcc main.S
来组装+链接,就像一样gcc hello.c
将编译+汇编+链接。