Assembly 在Hello world大会中使用了什么rip?

Assembly 在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

我找到了一些关于“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 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代码。