2012年3月10日 星期六

C inline assembly

延伸語法(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"
       );