"%% rax" в TinyHelloWorld.c - PullRequest
       34

"%% rax" в TinyHelloWorld.c

0 голосов
/ 26 декабря 2018

Этот код напечатан "Hello World!"и выйти без библиотеки C.ссылка (самосовершенствование программиста - ссылка, загрузка и библиотека)

Я не понимаю, почему в print () перед "rax" стоит "%%",но "%" перед "rax" в exit () .Я попытался добавить еще один "%" перед "rax" в exit (), и я получаю сообщение об ошибке:

TinyHelloWorld.c:14: Error: bad register name `%%rbx'
TinyHelloWorld.c:15: Error: bad register name `%%rax'

WRITE имеет системный вызов номер 4 и EXIT равен 1, яПонятия не имею, в чем разница по поводу использования "rax"?

char *str="Hello world!\n";

void print()
{
    asm("movq $13,%%rdx \n\t"
        "movq %0,%%rcx \n\t"
        "movq $0,%%rbx \n\t"
        "movq $4,%%rax \n\t"
        "int $0x80     \n\t"
        ::"r"(str):"edx","ecx","ebx");
}

void exit()
{
   asm("movq $42,%rbx   \n\t"
       "movq $1,%rax    \n\t"
       "int $0x80       \n\t");
}

void nomain()
{
   print();
   exit();
}

1 Ответ

0 голосов
/ 26 декабря 2018

В первом блоке используется «расширенная асм» , во втором «базовая асм» .В базовом asm один префикс% используется, как и в исходном коде отдельной сборки: для определения регистра.В расширенном asm префикс% используется для идентификации одного из дополнительных операторов (InputOperands, OutputOperands, Clobbers, GotoLabels).Чтобы сохранить префикс% регистров, вы должны удвоить его.Это называется строка специального формата .

Информативный: Как преобразовать базовый asm в расширенный asm

...