延伸語法(Extended ASM)
格式如下:
__asm__(assembler template
: output operands /* optional */
: input operands /* optional */
: list of clobbered registers /* optional */
);
"list of clobbered registers" : 告訴gcc這些registers在assembly code使用.
範例
把值從value存到result
#include
int main(void)
{
int value = 10;
int result;
asm("movl %1, %%eax;"
"movl %%eax, %0;"
: "=r"(result)
: "r"(value)
: "%eax"
);
printf("value: %d, result: %d\n", value, result);
return 0;
}
Brennan參考資料
x64系統修改的地方
1. 使用x86的方式來編譯,gcc使用-m32,ld使用-melf_i386
2. 使用x64的register,ex. eax => rax, 而movl改成mov
asm(
"mov $13, %%rdx;"
"mov %0, %%rcx;"
"mov $0, %%rbx;"
"mov $4, %%rax;"
"int $0x80;"
::"r"(str):"rdx", "rcx", "rbx"
);