如何创建一个使用系统调用指令打印“Hello World”的 GAS AT&T 格式主汇编程序?

问题描述 投票:0回答:1

我在 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 进行编译和链接主要的”。 我怎样才能做到这一点?

linux assembly gcc att gnu-assembler
1个回答
0
投票

_start
更改为
main
,并使用
lea msg(%rip), %rsi
,这样您的代码就不会使用任何 32 位绝对地址(并且与位置无关)


您还可以用

ret
替换退出系统调用。由于您不需要进行任何库函数调用或出于任何其他原因移动堆栈指针,因此它仍然指向返回地址。

如果您使用

gcc
,则不需要单独组装,您可以让它为您运行汇编器,例如
gcc -c main.S
,然后链接,或者只是
gcc main.S
来组装+链接,就像
一样gcc hello.c
将编译+汇编+链接。

© www.soinside.com 2019 - 2024. All rights reserved.