/*  语句块结构
__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;
}



你可能感兴趣的文章

评论区

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。