• 复习-C语言内嵌汇编-初级(1)


    打印hello world并改变变量i的值

     1 # include <stdio.h>
     2 
     3 int main()
     4 {
     5         int i = 0;
     6         __asm__(
     7                 "mov %0, #4
    "
     8                 :"=r" (i)       //输出
     9                 :               //输入
    10                 :"r0"           //保护
    11         );
    12         printf("hello world! %d
    ", i);
    13 }

    说明:mov可以将立即数传到寄存器,可以将一个寄存器的值传到另一个寄存器,但是不能跟内存打交道,跟内存打交道一般用ldr,str后面会说。

        第八行解释:“=r”  -----------------> 寄存器用了输出部分,输出也是可用的。

              “=&r” ------------------> 只用输出部分,输入不给任何人用。

              “+r” ---------------------> 输入与输出都用,对新手来说一般都用这个啦。

        第十行保护部分:首先__asm__(.......); 这条语句嵌入在C语言中,是当作一条指令;保护是保护R0之前的状态,就是__asm__之前的状态;程序最终都是要以汇编运行的,__asm__();之前也可能用到R0的吧?保护的就是这个R0,但是__asm__(...);里面也是可以用的;比如之前R0是100,asm指令完后还是100,中途随可以随便用。

    简单的加减乘除

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5         int i = 10;
     6         int j = 100;
     7         int sum = 0;
     8         //sum = i + j;
     9         __asm__(
    10                 "add %0, %1, %2
    "
    11                 : "=r" (sum)    //输出
    12                 : "r" (i), "r" (j)      //输入
    13         );
    14         //sub %0, %2, %1
    15         //mul %0, %1, %2
    16         printf("sum %d
    ", sum);
    17 }

    简单的做比较

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5         int i = 110;
     6         int j = 100;
     7         int sum = 0;
     8 #if 0   
     9         if(i > j)
    10                 sum = i;
    11         else
    12                 sum = j;
    13 #endif
    14         __asm__(
    15                 "cmp %1, %2
    "
    16                 "movgt %0, %1
    "
    17                 "movle %0, %2
    "
    18                 : "=r" (sum)    //输出
    19                 : "r" (i), "r" (j)      //输入
    20         );
    21         printf("sum %d
    ", sum);
    22 }

    说明: gt      ----------------      >

        lt       ----------------      <

       ge      ----------------      >=

       le       ----------------      <=

       eq      ----------------      ==

       ne!     ----------------      !=

    简单的累加和

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5         int i = 1;
     6         int sum = 0;
     7 
     8 #if 0
     9 bunfly:
    10         sum = sum + i;
    11         i++;
    12         if(i == 100)
    13                 goto haha;
    14         goto bunfly;
    15 haha:
    16         
    17 #else
    18         __asm__(
    19                 "mov %0, #0
    "
    20                 "mov %1, #1
    "
    21                 "bunfly:
    "
    22                 "add %0, %0, %1
    "
    23                 "add %1, %1, #1
    "
    24                 "cmp %1, #100
    "
    25                 "beq haha
    "
    26                 "bne bunfly
    "
    27                 "haha:
    "
    28 
    29                 : "=&r" (sum)   //输出
    30                 : "r" (i)       //输入
    31         );
    32 #endif
    33 
    34         printf("sum %d
    ", sum);
    35 }

    说明:汇编程序功能可参考上面的C语言就很容易看懂汇编的意义,需要注意的是19,20两行的初始化以及29行的“=&r”。

     这些程序都是再tiny4412板子上运行,当然使用的交叉编译,例:arm-none-linux-gnueabi-gcc 4.c -o 4

  • 相关阅读:
    python 开源机器学习包
    linux hadoop 集群安装步骤
    bbc 大数据
    微信小程序弹出可填写框两种方法
    js 一个对象的属性名是一个变量怎么处理?
    解决微信小程序使用switchTab跳转后页面不刷新的问题
    SQL 和 NoSQL 的区别
    IndexedDB API
    jQuery jsonp跨域请求
    关于setInterval返回值问题
  • 原文地址:https://www.cnblogs.com/luoxiang/p/4191533.html
Copyright © 2020-2023  润新知