打印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