首页 > 代码库 > 复习-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)