TinyHelloWorld.c中的“ %% rax”

时间:2018-12-26 14:14:12

标签: assembly x86-64 inline-assembly

此代码打印“ Hello World!”。并在没有C库的情况下退出。 ref。(程序员的自我修养-链接,负载和库)

我不明白为什么print()中的“ rax”前面有“ %%” ,但是exit()中的“ rax”前面是“%” / strong>。我试图在exit()的“ rax”前面添加另一个“%”,但出现错误消息:

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 :(得分:3)

第一个块使用"extended asm",第二个块"basic asm"。在基本asm中,单个%前缀的用法与独立程序集源代码中的用法相同:确定寄存器。在扩展asm中,%前缀用于标识其他运算符之一(InputOperands,OutputOperands,Clobbbers,GotoLabels)。要保留寄存器的%前缀,必须将其加倍。这称为special format string

内容丰富:How to Convert Basic asm to Extended asm