复习-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

原文地址:https://www.cnblogs.com/luoxiang/p/4191533.html