gcc内敛汇编实现----加-减

简介:

a+b

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. //#include <avr/io.h>  
  4.   
  5. // 使用指定的寄存器实现两个操作数相加  
  6. int AddReg(int a, int b);  
  7. // 不指定寄存器实现两个整数相加  
  8. int Add(int a, int b);  
  9.   
  10. // Main Funciton  
  11. int main(void)  
  12. {  
  13.     printf("%d\n", AddReg(10, 15));     // 调用AddReg函数  
  14.     printf("%d\n", Add(10, 15));        // 调用Add函数  
  15.   
  16.   
  17.     int a = 10, b = 15, sum;            // 主函数内部直接潜入汇编代码  
  18.     __asm__ __volatile__  
  19.     (  
  20.         "addl %%ebx, %%eax"  
  21.         : "=a"(sum)  
  22.         : "a"(a), "b"(b)  
  23.         :  
  24.      );  
  25.      printf("%d\n", sum);  
  26.   
  27.      return EXIT_SUCCESS;  
  28. }  
  29.   
  30.   
  31.   
  32.   
  33.   
  34. // 使用指定的寄存器实现两个操作数相加  
  35. int AddReg(int a, int b)  
  36. {  
  37.     __asm__ __volatile__  
  38.     (  
  39.         "addl %%ebx, %%eax"  
  40.         : "=a"(a)  
  41.         : "b"(b), "a"(a)  
  42. //        : "%ebx", "%eax"  
  43.     );  
  44.   
  45.     return a;  
  46. }  
  47.   
  48. // 不指定寄存器实现两个整数相加  
  49. int Add(int a, int b)  
  50. {  
  51.     __asm__ __volatile__  
  52.     (  
  53.         //"lock;\n"  
  54.         "addl %1,%0;\n"  
  55.         : "=m"(a)  
  56.         : "r"(b), "m"(a)  
  57.         :  
  58.     );  
  59.   
  60.     return a;  
  61. }  
#include <stdio.h>
#include <stdlib.h>
//#include <avr/io.h>

// 使用指定的寄存器实现两个操作数相加
int AddReg(int a, int b);
// 不指定寄存器实现两个整数相加
int Add(int a, int b);

// Main Funciton
int main(void)
{
    printf("%d\n", AddReg(10, 15));     // 调用AddReg函数
    printf("%d\n", Add(10, 15));        // 调用Add函数


    int a = 10, b = 15, sum;            // 主函数内部直接潜入汇编代码
    __asm__ __volatile__
    (
        "addl %%ebx, %%eax"
        : "=a"(sum)
        : "a"(a), "b"(b)
        :
     );
     printf("%d\n", sum);

     return EXIT_SUCCESS;
}





// 使用指定的寄存器实现两个操作数相加
int AddReg(int a, int b)
{
    __asm__ __volatile__
    (
        "addl %%ebx, %%eax"
        : "=a"(a)
        : "b"(b), "a"(a)
//        : "%ebx", "%eax"
    );

    return a;
}

// 不指定寄存器实现两个整数相加
int Add(int a, int b)
{
    __asm__ __volatile__
    (
        //"lock;\n"
        "addl %1,%0;\n"
        : "=m"(a)
        : "r"(b), "m"(a)
        :
    );

    return a;
}

a-b

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. //#include <avr/io.h>  
  4.   
  5. // 使用指定的寄存器两个参数相减  
  6. int SubReg(int a, int b);  
  7.   
  8. // 不指定寄存器实现两个参数相减  
  9. int Sub(int a, int b);  
  10.   
  11.   
  12.   
  13.   
  14. int main(void)  
  15. {  
  16.   
  17.      printf("%d\n", SubReg(100, 10));       // 调用SubReg  
  18.      printf("%d\n", Sub(100, 10));          // 调用Sub  
  19.   
  20.      int a = 100, b = 10, sub;  
  21.      __asm__ __volatile__  
  22.     (  
  23.         "subl %%ebx, %%eax"  
  24.         : "=a"(sub)  
  25.         : "b"(b), "a"(a)  
  26. //        : "%ebx", "%eax"  
  27.     );  
  28.     printf("%d\n", sub);  
  29.   
  30.     //system("PAUSE");  
  31.     return 0;  
  32. }  
  33.   
  34.   
  35.   
  36. // 使用指定的寄存器两个参数相减  
  37. int SubReg(int a, int b)  
  38. {  
  39.     __asm__ __volatile__  
  40.     (  
  41.         "subl %%ebx, %%eax;"  
  42.         : "=a"(a)  
  43.         : "b"(b), "a"(a)  
  44.         :  
  45.     );  
  46.   
  47.     return a;  
  48. }  
  49.   
  50. // 不指定寄存器实现两个参数相减  
  51. int Sub(int a, int b)  
  52. {  
  53.     __asm__ __volatile__  
  54.     (  
  55.         "subl %1, %0;"  
  56.         : "=m"(a)  
  57.         : "r"(b), "m"(a)  
  58.         :  
  59.     );  
  60.   
  61.     return a;  
  62. }  


转载:http://blog.csdn.net/gatieme/article/details/44653067

目录
相关文章
|
3月前
|
NoSQL 编译器 开发工具
006.gcc编译器
gcc是什么?
43 0
006.gcc编译器
|
4月前
|
存储 NoSQL 算法
从一个crash问题展开,探索gcc编译优化细节
问题分析的过程也正是技术成长之路,本文以一个gcc编译优化引发的crash为切入点,逐步展开对编译器优化细节的探索之路,在分析过程中打开了新世界的大门……
409 1
|
4天前
|
C语言
转载 - gcc/ld 动态连接库和静态连接库使用方法
本文介绍了如何在GCC中实现部分程序静态链接、部分动态链接。使用`-Wl`标志传递链接器参数,`-Bstatic`强制链接静态库,`-Bdynamic`强制链接动态库。
15 0
|
1月前
|
编译器 C语言 C++
列举gcc 常见和有用的编译警告选项
列举gcc 常见和有用的编译警告选项
11 0
|
1月前
|
编译器 C语言
gcc编译警告:warning: suggest parentheses around assignment used as truth value
gcc编译警告:warning: suggest parentheses around assignment used as truth value
16 0
|
1月前
|
编译器 Linux C语言
gcc编译器的使用方法
gcc编译器的使用方法
20 1
|
2月前
|
编译器 C语言
gcc/g++语法
gcc/g++语法
|
4月前
|
C语言
gcc静态编译/usr/bin/ld: cannot find -lc
gcc静态编译/usr/bin/ld: cannot find -lc
|
5月前
|
编译器 程序员 C语言
gcc的编译过程和gcc与g++的区别
gcc的编译过程和gcc与g++的区别
52 0
|
6月前
|
C语言
编译安装gcc
编译安装gcc

推荐镜像

更多