неизвестная переменная "ptr" в коде golang asm - PullRequest
0 голосов
/ 15 февраля 2019

Недавно я только начал читать исходный код atomic.LoadUint64, затем я получил неизвестную переменную "ptr" в следующем коде asm:

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

Я не смог найти объявление этогопеременная, и любые документы об этой переменной, кто-нибудь может сказать мне об этом?

1 Ответ

0 голосов
/ 15 февраля 2019

Краткое руководство по ассемблеру Go

Символы

Псевдорегистр FP - это виртуальный указатель кадра, используемыйссылаться на аргументы функции.Компиляторы поддерживают указатель виртуального фрейма и ссылаются на аргументы в стеке как на смещения из этого псевдорегистра.Таким образом, 0(FP) - первый аргумент функции, 8(FP) - второй (на 64-битной машине) и т. Д.Однако, когда вы ссылаетесь на аргумент функции таким образом, необходимо поместить имя в начале, как в first_arg+0(FP) и second_arg+8(FP).(Значение смещения - смещение от указателя кадра - отличается от его использования с SB, где это смещение от символа.) Ассемблер применяет это соглашение, отвергая простые 0(FP) и 8(FP).Фактическое имя семантически не имеет значения, но его следует использовать для документирования имени аргумента.Стоит подчеркнуть, что FP - это всегда псевдорегистр, а не аппаратный регистр, даже на архитектурах с аппаратным указателем фрейма.


ptr, в ptr+0(FP),это имя для первого аргумента функции.Аргументом, вероятно, является указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...