此代码打印“ 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();
}
答案 0 :(得分:3)
第一个块使用"extended asm",第二个块"basic asm"。在基本asm中,单个%前缀的用法与独立程序集源代码中的用法相同:确定寄存器。在扩展asm中,%前缀用于标识其他运算符之一(InputOperands,OutputOperands,Clobbbers,GotoLabels)。要保留寄存器的%前缀,必须将其加倍。这称为special format string。