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

a+b

[cpp] view plain copy print?

  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

[cpp] view plain copy print?

  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

时间: 2025-01-21 07:24:25

gcc内敛汇编实现----加-减的相关文章

C语言内嵌汇编(arm-v7)----加减乘移位

在现代嵌入式操作系统中,汇编语言当然必不可少,汇编语言的优势就是执行速度快.如果在C语言的代码中,在关键的地方内嵌汇编,那么效率将会大大的提高,我们来看看代码: #include <stdio.h> int main(void) { int a = 10 ; int b = 20 ; int addsum ; int subsum ; // int mulsum ; __asm__ __volatile__ ( //传参 "mov r0 , %2 \n" //mov 执行是

C语言实现大整数加减运算详解_C 语言

前言     我们知道,在数学中,数值的大小是没有上限的,但是在计算机中,由于字长的限制,计算机所能表示的范围是有限的,当我们对比较小的数进行运算时,如:1234+5678,这样的数值并没有超出计算机的表示范围,所以可以运算.但是当我们在实际的应用中进行大量的数据处理时,会发现参与运算的数往往超过计算机的基本数据类型的表示范围,比如说,在天文学上,如果一个星球距离我们为100万光年,那么我们将其化简为公里,或者是米的时候,我们会发现这是一个很大的数.这样计算机将无法对其进行直接计算.     可

c语言-我写的是两个数的加减运算,以字符串数组形式保存

问题描述 我写的是两个数的加减运算,以字符串数组形式保存 #include #include void main(void) { char str1[30]={0}; char str2[30]={0}; char str3[30]={0}; printf("Please input the first number:"); gets(str1); printf("Please input the second number:"); gets(str3); add(

1602显示时钟可以调节时分秒(加减)

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define uchar unsigned char #define uint unsigned int static uchar count,j,s1num; char shi,fen,miao; sbit RS = P2^4; //Pin4 sbit RW = P2^5; //Pin5 sbit E = P2^6; //Pin6 sbit s1=P3^0; //矩阵键盘分离出独立键盘

Vdsp(bf561)中的浮点运算(6):float加减运算

一直以为float加减运算很简单,无非就是将之转换为__float32_add和__float32_sub这两个函数调用而已,然后用软件模拟进行加减运算.但真的如此简单吗?当一些让人不太舒服的条件出现的时候,还是如此吗? 1.1 Vdsp对float加减运算的处理 在vdsp下,可以很简单地用: float add(float x, float y) { float r = x + y; return r; } float sub(float x, float y) { float r = x

javascript实现日期按月份加减

 JavaScript实现日期加减计算功能代码实例,因为在js中没有类似C#中的AddDays方法,所以要想实现日期加减的话,就需要自己写函数来实现.这里分享给大家,有需要的小伙伴可以参考下     项目中需要用到,自己写了一个.javascript日期按月加减 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

PHP中的日期加减方法示例_php实例

几乎所有从事程序开发的程序员都遇到时间处理问题,PHP开发也一样,幸运的是PHP提供了很多关于日期时间函数.只要经常使用这些函数,搭配使用,日期时间处理上就熟能生巧了. 今天要讲的这个例子,需求是这样的.得知某个日期时间, 如:2012-04-25 10:10:00 我要在这个日期时间的基础上加上5个月并返回处理后的日期 结果:2012-04-25 10:10:00 加5个月等于 2012-09-25 10:10:00 这个需求看似简单,但还是有点棘手,因为PHP没有直接提供yyyy-mm-dd

jQuery实现数字加减效果汇总_jquery

我们在网上购物提交订单时,在网页上一般会有一个选择数量的控件,要求买家选择购买商品的件数,开发者会把该控件做成可以通过点击实现加减等微调操作,当然也可以直接输入数字件数. 左右加减数字 像京东提交订单时目前使用的是左右加减数字的效果,这个效果直接明了,操作简单.我们使用jquery.spinner.js插件实现左右加减数字,调用方法非常简单.   复制代码 代码如下: <input type="text" class="spinner"/> 调用也非常简

数据类型-delphi 从服务器上收到的数据能直接做加减吗

问题描述 delphi 从服务器上收到的数据能直接做加减吗 通过CTP的收到期货的市场数据,LASTPRICE是最新价格,是实时更新的.我可以打印LPRICE1和LPRICE2,但是他们的差值就不行,别的地方直接用LPRICE1和LPRICE2也不行,求高手指点啊!!越详细越好!! Var lprice1,lprice2,chajia:double;全局变量 procedure TForm1.CTPMarketData(ASender: TObject; const InstrumentID: