Что делает этот обратный слеш в этом коде сборки? - PullRequest
0 голосов
/ 20 июня 2019

Я не уверен, какая разница в этих линиях.(урезано из Linux x86 / entry / call.h , с удаленным очищением xor-zero.)

.macro PUSH_AND_CLEAR_REGS rdx=%rdx rax=%rax save_ret=0
    pushq \rdx
    pushq \rax
    pushq %r11
    pushq %r12
.endm

Оба помещают в стек?Или первые две линии толчка делают что-то другое?Я использую Linux с помощью цепочки инструментов GNU.

Эти строки были найдены в файле .h, который включен в .S исходные файлы asm.

Также кто-нибудь может сказать мне, что делает этот код?

.macro PUSH_AND_CLEAR_REGS rdx=%rdx rax=%rax save_ret=0

В частности, код после PUSH_AND_CLEAR_REGS.

1 Ответ

2 голосов
/ 20 июня 2019

Внутри ГАЗ .macro, вы используете \foo для ссылки на параметр макроса, называемый foo.

.macro, на который вы смотрите, имеет 3 аргументасо значениями по умолчанию;предположительно в некоторых случаях они хотят получить альтернативные значения, сохраненные вместо того, что есть в RAX и RDX.Но остальные регистры сохраняются и обнуляются как обычно.

Так что после расширения макроса, да, это просто push %rdx и push %rax, так же, как push %r11 и push %r12.


IDK, если вы просматривали старую версию Linux, но она находится в .h, который включен в другие .S рукописные исходные файлы asm, не от .c источников.Я исправил ваш вопрос к вам.

Я думал, что комментарий к определению макроса GAS был довольно ясным о назначении этого макроса.Смотрите ссылку на github, которую я добавил к вашему вопросу.

...