猿问

golang asm代码中的未知“ptr”变量

最近刚开始看atomic.LoadUint64的源码,在下面的asm代码中得到了一个未知变量“ptr”:


TEXT runtime∕internal∕atomic·Load64(SB), NOSPLIT, $0-12                                                                                                                                                                                       

    MOVL    ptr+0(FP), AX                                                                                                                                                                                                                     

    TESTL   $7, AX                                                                                                                                                                                                                            

    JZ  2(PC)                                                                                                                                                                                                                                 

    MOVL    0, AX // crash with nil ptr deref                                                                                                                                                                                                 

    MOVQ    (AX), M0                                                                                                                                                                                                                          

    MOVQ    M0, ret+4(FP)                                                                                                                                                                                                                     

    EMMS                                                                                                                                                                                                                                      

    RET

我找不到这个变量的声明,也找不到任何关于这个变量的文档,谁能告诉我一下?


慕娘9325324
浏览 98回答 1
1回答

HUH函数

Go 汇编程序快速指南符号伪寄存器FP是用于引用函数参数的虚拟帧指针。编译器维护一个虚拟帧指针并将堆栈上的参数引用为该伪寄存器的偏移量。因此0(FP)是函数的第一个参数, 8(FP)是第二个(在 64 位机器上),依此类推。但是,当以这种方式引用函数参数时,有必要在开头放置一个名称,如first_arg+0(FP)and second_arg+8(FP)。(偏移量的含义——从帧指针开始的偏移量——不同于它在 中的使用SB,它是从符号开始的偏移量。)汇编器强制执行此约定,拒绝普通0(FP)和 8(FP). 实际名称在语义上无关紧要,但应该用于记录参数名称。值得强调的是,它FP始终是伪寄存器,而不是硬件寄存器,即使在具有硬件帧指针的体系结构上也是如此。ptr, in ptr+0(FP), 是函数第一个参数的名称。该参数可能是一个指针。
随时随地看视频慕课网APP

相关分类

Go
我要回答