[2015-07-21修改]xcode/gcc 内嵌汇编 AT&T 总结 -by 飘云
http://www.dllhook.com/post/60.html/*语句块结构
__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 == %0a、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 %, %\n\r" "mov %, %\n\r" :"=r"(c) :"r"(a), "r"(b) :"memory" ); return c;}
{:soso_e165:}学习了 学习了。谢谢飘哥抽空写代码 谢谢分享。。。。。学习了呀。
膜拜神贴,后面的请保持队形~ 谢谢分享。。。。。学习了呀。
页:
[1]