/* 语句块结构
__asm__("汇编语句"
:输出
:输入 // 可以省略
:会被修改的寄存器 // 可以省略
);
// 或者
asm volatile("汇编语句"
:输出
:输入 // 可以省略
:会被修改的寄存器 // 可以省略
);
*/
demo:
void asm_test()
{
int myebp = 0;
__asm__("mov %%ebp, %0\n\n\t"
: "=g" (myebp)
:
:);
printf("Dyld return address: %x\n", (myebp - 0xc));
}
// 加法函数简洁写法
int asm_sum(int a, int b)
{
int c = 0; // %0 注意这里c == %0 a、b分别为%1, %2
__asm__("addl %2, %1 \n\t"
:"=r"(c)
:"r"(a), "r"(b) // 输入参数
:);
return c;
}
// 另外一种写法-直观一点,但是不简洁
int asm_sum2(int a, int b)
{
int c = 0; // %0
__asm__("movl %1, %%eax;"
"movl %2, %%ebx;"
"addl %%ebx, %%eax;"
"movl %%eax, %0;"
:"=r"(c)
:"r"(a), "r"(b)
:"eax", "ebx");
return c;
}
// 减法函数简洁写法
int asm_sub(int a, int b)
{
int c = 0; // %0
__asm__("subl %2, %1 \n\t"
:"=r"(c)
:"r"(a), "r"(b) // 输入参数
:);
return c;
}
void get_cpuid()
{
unsigned int s1,s2;
asm volatile (
"movl $0x01 , %%eax;"
"cpuid;"
"movl %%edx ,%0;"
"movl %%eax ,%1;"
:"=m"(s1),"=m"(s2)
:
:
);
printf("%08X%08X\n",s1,s2);
}
// 2015-07-21 增加两种写法,更加通俗易懂
// 纯汇编+裸函数
__attribute__((naked)) int asm_add_naked(int a, int b){
__asm__("add %0, %1\n\r"
"mov %1, %%eax\n\r"
"ret" // 别偷懒-自行返回
:
:"r"(a), "r"(b)
:"memory"
);
}
// 推荐这种写法,可读性极高
int asm_add_new(int a, int b){
int c;
__asm__("add %[aa], %[bb]\n\r"
"mov %[bb], %[cc]\n\r"
:[cc]"=r"(c)
:[aa]"r"(a), [bb]"r"(b)
:"memory"
);
return c;
}
发表评论