1.
1 void main(void)
2 {
3 int n=0,a=0;
4 __asm__ __volatile__( ///asm表示接下来是汇编语言,__volatile__表示下面的代码编译时不优化
5 // "MOV r0 , #66
"//汇编不写分号,通过
表示一句的结束,mov指令是将立即数与
6 //指令存放在一起的,理论上12位,但是8位用来存数据,4位存移位,超过8位用指令ldr
7 // "MOV %0, r0
"
8 //"ldr %0, =123456
" //ldr 用=号,不用#号
9 // "add %0,%0,#4"
10 "mrs %0 , cpsr
"//查看cpsr的状态标志 cpsr的状态值可以通过cmp或者xxs来改变(xx代表命令)
11 "movs r2, #11
"//寄存器结果如果为0,CPSR的Z标志为为1,否则为0
12 "mrs %1 , cpsr
"
13
14 :"=r"(n),"=r"(a) //不能写分号
15 );
16 printf("r=%p
",n);
17 printf("a=%p
",a);
18 }
注:cpsr寄存器的Z标志位可以用来比较,类似于if函数/通过cmp比较两个寄存器的大小,然后结果会更新cpsr的标志位,
然后用类似于moveq()或movne()来选择执行什么函数
2.
1 1. 在c里内嵌汇编 2 __asm__ __volatile__( 3 "汇编代码 " 4 "汇编代码 " 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__ 告诉编译器不要优化下面的汇编代码, 可用可不用