飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3651|回复: 5

[macOS] [2015-07-21修改]xcode/gcc 内嵌汇编 AT&T 总结 -by 飘云

  [复制链接]
  • TA的每日心情
    难过
    3 天前
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2015-1-8 17:48:01 | 显示全部楼层 |阅读模式
    http://www.dllhook.com/post/60.html

    1. /*  语句块结构
    2. __asm__("汇编语句"
    3.        :输出
    4.        :输入  // 可以省略
    5.        :会被修改的寄存器 // 可以省略
    6.        );
    7.         
    8. // 或者
    9. asm volatile("汇编语句"
    10.        :输出
    11.        :输入  // 可以省略
    12.        :会被修改的寄存器 // 可以省略
    13.        );
    14. */


    15. demo:

    16. void asm_test()
    17. {
    18.     int myebp = 0;
    19.     __asm__("mov %%ebp, %0\n\n\t"
    20.             : "=g" (myebp)
    21.             :
    22.             :);
    23.     printf("Dyld return address: %x\n", (myebp - 0xc));
    24. }

    25. // 加法函数简洁写法
    26. int asm_sum(int a, int b)
    27. {
    28.     int c = 0; // %0  注意这里c == %0  a、b分别为%1, %2
    29.      
    30.     __asm__("addl %2, %1 \n\t"
    31.             :"=r"(c)
    32.             :"r"(a), "r"(b) // 输入参数
    33.             :);
    34.      
    35.     return c;
    36. }

    37. // 另外一种写法-直观一点,但是不简洁
    38. int asm_sum2(int a, int b)
    39. {
    40.     int c = 0; // %0
    41.     __asm__("movl %1, %%eax;"
    42.             "movl %2, %%ebx;"
    43.             "addl %%ebx, %%eax;"
    44.             "movl %%eax, %0;"
    45.             :"=r"(c)
    46.             :"r"(a), "r"(b)
    47.             :"eax", "ebx");
    48.      
    49.     return c;
    50. }

    51. // 减法函数简洁写法
    52. int asm_sub(int a, int b)
    53. {
    54.     int c = 0; // %0
    55.      
    56.     __asm__("subl %2, %1 \n\t"
    57.             :"=r"(c)
    58.             :"r"(a), "r"(b) // 输入参数
    59.             :);
    60.      
    61.     return c;
    62. }

    63. void get_cpuid()
    64. {
    65.     unsigned int s1,s2;
    66.     asm volatile (
    67.                   "movl $0x01 , %%eax;"
    68.                   "cpuid;"
    69.                   "movl %%edx ,%0;"
    70.                   "movl %%eax ,%1;"
    71.                   :"=m"(s1),"=m"(s2)
    72.                   :
    73.                   :
    74.                   );
    75.     printf("%08X%08X\n",s1,s2);
    76. }
    复制代码




    // 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;
    }

    评分

    参与人数 2威望 +12 飘云币 +8 收起 理由
    sndncel + 4 神马都是浮云
    逍遥枷锁 + 8 + 8 赞一个!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2015-10-29 08:08
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2015-1-8 18:01:01 | 显示全部楼层
    {:soso_e165:}学习了
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2024-3-10 19:49
  • 签到天数: 473 天

    [LV.9]以坛为家II

    发表于 2015-1-9 09:38:20 | 显示全部楼层
    学习了。谢谢飘哥抽空写代码
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2024-4-13 20:08
  • 签到天数: 2046 天

    [LV.Master]伴坛终老

    发表于 2015-1-9 10:22:01 | 显示全部楼层
    谢谢分享。。。。。学习了呀。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 958 天

    [LV.10]以坛为家III

    发表于 2015-1-9 15:23:48 | 显示全部楼层

    膜拜神贴,后面的请保持队形~
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 2091 天

    [LV.Master]伴坛终老

    发表于 2015-1-9 20:07:51 | 显示全部楼层
    谢谢分享。。。。。学习了呀。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表