Assembly 在Hello world大会中使用了什么rip?
我找到了一些关于“hello world”的汇编代码,但我不懂 leaq L1(%rip),%rdi,为什么这里使用ripAssembly 在Hello world大会中使用了什么rip?,assembly,x86-64,Assembly,X86 64,我找到了一些关于“hello world”的汇编代码,但我不懂 leaq L1(%rip),%rdi,为什么这里使用rip .text .globl _main _main: pushq %rbp movq %rsp, %rbp leaq L1(%rip), %rdi <--it's the first time that I found IP is directly used in code. movq $0, %rax callq print
.text
.globl _main
_main:
pushq %rbp
movq %rsp, %rbp
leaq L1(%rip), %rdi <--it's the first time that I found IP is directly used in code.
movq $0, %rax
callq printf
movq #0, %rax <-sorry, here shoud be $0
leaveq
retq
.data
L1: .string 'hello jason\n'
因此,我不理解第一个程序,为什么使用%rip?这很奇怪。您的第二个示例是NASM语法(Intel语法的一种风格),适用于32位堆栈args调用约定,而您的第一个代码块是针对x86-64的GAS AT&T语法()(使用寄存器args调用约定),在禁用优化的情况下编译。链接副本中专门介绍了RIP相对寻址的使用。此外,您显然没有复制粘贴此内容,因为
movq#0,%rax
是一个语法错误。也许你又是说$0
?嗯,这看起来很像GCC输出,但事实并非如此。编译器将使用mov$0、%eax
,而不是更大的movq$0、%eax
,GCC将在函数中使用pop%rbp
,而不是leave
,在将rbp设置为帧指针后,它不会移动RSP。此外,字符串文字位于.data
中,而不是.rodata
中。所以看起来好像有人拿走了GCC的标签名称和未优化的输出,然后使情况变得更糟。嗨,彼得,这是我的错,应该是movq$0,%rax,谢谢。第二个代码来自NASM代码。