• 汇编基础知识


    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__ 告诉编译器不要优化下面的汇编代码, 可用可不用
  • 相关阅读:
    软件工程第四次作业
    软件工程第三次作业
    软件工程第二次作业
    软件工程第一次作业
    软件工程最后一次作业
    软件工程第四次作业
    软件工程第二次作业
    软件工程最后一次作业
    软件工程第二次结对作业
    软件工程第三次作业
  • 原文地址:https://www.cnblogs.com/edan/p/9084398.html
Copyright © 2020-2023  润新知