首页 > 代码库 > 复习-C语言内嵌汇编-初级(1)
复习-C语言内嵌汇编-初级(1)
打印hello world并改变变量i的值
1 # include <stdio.h> 2 3 int main() 4 { 5 int i = 0; 6 __asm__( 7 "mov %0, #4\n" 8 :"=r" (i) //输出 9 : //输入10 :"r0" //保护11 );12 printf("hello world! %d\n", 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\n"11 : "=r" (sum) //输出12 : "r" (i), "r" (j) //输入13 );14 //sub %0, %2, %115 //mul %0, %1, %216 printf("sum %d\n", 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 else12 sum = j;13 #endif14 __asm__(15 "cmp %1, %2\n"16 "movgt %0, %1\n"17 "movle %0, %2\n"18 : "=r" (sum) //输出19 : "r" (i), "r" (j) //输入20 );21 printf("sum %d\n", 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 #else18 __asm__(19 "mov %0, #0\n"20 "mov %1, #1\n"21 "bunfly:\n"22 "add %0, %0, %1\n"23 "add %1, %1, #1\n"24 "cmp %1, #100\n"25 "beq haha\n"26 "bne bunfly\n"27 "haha:\n"28 29 : "=&r" (sum) //输出30 : "r" (i) //输入31 );32 #endif33 34 printf("sum %d\n", sum);35 }
说明:汇编程序功能可参考上面的C语言就很容易看懂汇编的意义,需要注意的是19,20两行的初始化以及29行的“=&r”。
这些程序都是再tiny4412板子上运行,当然使用的交叉编译,例:arm-none-linux-gnueabi-gcc 4.c -o 4
复习-C语言内嵌汇编-初级(1)