汇编基础知识

1.

 1 void main(void)
 2    {
 3        int n=0,a=0;
 4        __asm__ __volatile__(  ///asm表示接下来是汇编语言,__volatile__表示下面的代码编译时不优化
 5           // "MOV r0 ,  #66\n"//汇编不写分号,通过\n 表示一句的结束,mov指令是将立即数与
 6           //指令存放在一起的,理论上12位,但是8位用来存数据,4位存移位,超过8位用指令ldr
 7           // "MOV  %0,  r0\n"
 8            //"ldr  %0,   =123456\n"  //ldr 用=号,不用#号
 9           // "add    %0,%0,#4"
10          "mrs %0 , cpsr\n"//查看cpsr的状态标志    cpsr的状态值可以通过cmp或者xxs来改变(xx代表命令)
11          "movs r2, #11\n"//寄存器结果如果为0,CPSR的Z标志为为1,否则为0
12          "mrs %1 , cpsr\n"
13   
14           :"=r"(n),"=r"(a)   //不能写分号
15       );
16       printf("r=%p\n",n);
17       printf("a=%p\n",a);
18   }

注:cpsr寄存器的Z标志位可以用来比较,类似于if函数/通过cmp比较两个寄存器的大小,然后结果会更新cpsr的标志位,
  然后用类似于moveq()或movne()来选择执行什么函数

2.

 1 1. 在c里内嵌汇编
 2          __asm__ __volatile__(
 3          "汇编代码 \n"              
 4          "汇编代码 \n"
 5     :"=r"(c变量名)    //第一个冒号表示从汇编里输出到c语言的变量, =号表示在汇编里只能改变C变量的值,而不能取它的值. +号表示可以取变量值,也可改变变量的值. r表示在汇编里用一个寄存器代替c变量
 6 
 7     :"r"(c变量名) //第二个冒号表示汇编里只能取c变量的值, 不能再有"=","+"号
 8         //输入的变量的寄存器只能使用一次, 如果多次使用此输入的值,则应放到一个固定的寄存器上面(R0-R12)
 9 
10     :"r0", "r1" //第三个冒号表示告诉编译器不要把r0, r1寄存器分配给%0, %1等
11         );  
12     // __volatile__ 告诉编译器不要优化下面的汇编代码, 可用可不用

猜你喜欢

转载自www.cnblogs.com/edan/p/9084398.html