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. }  

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

目录
相关文章
|
编译器 Linux 开发工具
|
NoSQL 编译器 开发工具
006.gcc编译器
gcc是什么?
192 0
006.gcc编译器
|
存储 NoSQL 算法
从一个crash问题展开,探索gcc编译优化细节
问题分析的过程也正是技术成长之路,本文以一个gcc编译优化引发的crash为切入点,逐步展开对编译器优化细节的探索之路,在分析过程中打开了新世界的大门……
|
前端开发 C语言
gcc动态库升级
gcc动态库升级
|
10月前
|
存储 编译器 C语言
深入理解GCC 和 G++ 编译器
GCC 和 G++ 是 GNU 工具链中的核心编译器,支持 C 和 C++ 程序开发。本文详细介绍其编译流程、常用选项及动态链接与静态链接的区别。编译过程分为预处理、编译、汇编和链接四个阶段,每个阶段有特定任务和命令选项。常用选项如 `-E`、`-S`、`-c` 和 `-o` 分别用于预处理、生成汇编代码、生成目标文件和指定输出文件。动态链接节省空间且易于更新,但依赖运行时库;静态链接独立高效,但文件较大且更新困难。合理选择优化选项(如 `-O0` 至 `-O3`)可提升程序性能。掌握这些知识有助于开发者更高效地编写、调试和优化代码。
526 23
深入理解GCC 和 G++ 编译器
|
编译器 Linux C语言
gcc的编译过程
GCC(GNU Compiler Collection)的编译过程主要包括四个阶段:预处理、编译、汇编和链接。预处理展开宏定义,编译将代码转换为汇编语言,汇编生成目标文件,链接将目标文件与库文件合并成可执行文件。
461 11
|
编译器 开发工具 C语言
Gcc 链接文件
Gcc 链接文件
157 4
|
编译器 C语言 C++
MinGW安装gcc
MinGW安装gcc
423 0
|
C语言
gcc的简易用法
【5月更文挑战第10天】gcc的简易用法。
186 8
|
C语言
gcc的简易用法(编译、参数与链接)
【5月更文挑战第14天】gcc的简易用法(编译、参数与链接)。
162 1