计算机三级之嵌入式系统学习笔记2

  • ARM对存储器只有加载和存储两种操作,因此凡是与存储器操作有关的指令仅限于两类指令,即LDR和STR,其他指令无效
  • “#”:立即数符号
    • 例:#12(十进制),#0x12(十六进制)
  • “!”:更新基址寄存器符号,它表示指令在完成操作之后最后的地址应该写入基址寄存器中
  • LDR(加载)

    • 例:
      LDR R0, [R1,#4] ;R0<—[R1+4]
      LDR R0, [R1,#4]! ;R0<—[R1+4]、R1<—R1+4
      LDR R0,[R1],R2 ;将由R1指示的存储器的字数据读入寄存器R0,并 将新地址R1+R2写入R1
      LDR R0,#0X23 ;这是错误的指令,因为LDR是把第二个操作数给加载到第一个操作数,且第二个操作数不能使立即数。如果第二个数必须是立即数的时候,要在立即数前面加上“=”,如
      LDR R1,=0X1234 ; R1=0X1234
  • STR(存储)

    • 例:
      STR R1, [R2,#8] ;[R2+8]<—R1
      STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1
  • MOV(数据传送)

    • 例:
      MOV R1,R0,LSL #3 ;将寄存器R0中的值左移3位后传送到R1
  • TST(位测试指令):按位相与,查看CPSR对应标志位

  • TEQ(相等测试指令):按位相异或,查看CPSR对应标志位
  • ADD(不带进位的加法):

    • 例:
      ADD R0,R2,R3,LSL,#1 ;R0=R2+(R3<<1)
  • BIC(位清除指令)

    • 例:
      BIC R0,R0,#0X0B ;该指令清除R0中的位0,1和3,其余的位保持不变
  • ARM汇编分支程序采用转移指令B子程序调用指令BL或条件转移指令BX来实现;在ARM汇编中一般没有专门的指令用来实现循环,一般采用比较指令CMP、ADD或SUB等能实现产生条件的指令,然后再通过带状态的条件转移指令BX来实现

  • IMPORT:
    • 例:
      IMPORT Label ;IMPORT伪指令用于通知编译器要使用的标号在其他源文件中已经定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。
  • EXPORT:此伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用
  • ARM处理器支持的伪指令有ADR、LDR和NOP

    • ADR伪指令:用于把相对偏移地址加载到通用寄存器中
      • 例:
        ADR R0,mloop ;将mloop对应的相对偏移地址传送到R0中
    • LDR伪指令:用于一个32位常数的加载或地址的加载

      • 使用LDR伪指令有两个目的:

        • 当用MOV或MNV指令无法加载符合要求的32位立即数时,可用LDR伪指令加载任意32位操作数到寄存器。因为MOV或MNV指令加载的32位数据只能是8位立即数通过移位的方式得到,所以不能加载任意32位常数
        • 当需要程序的相对偏移地址或外部地址加载到寄存器时可用LDR伪指令
      • 例:
        LDR R1,=0X1234 ;R1=0X1234
        LDR R1,=0XABCDEF98 ;R2=0XABCDEF98
        LDR R3,=Mloop ;将Mloop对应的地址传送到R3中

  • HI: 无符号数大于
  • CS:无符号数大于等于
  • GT:带符号数大于
  • LT:带符号数小于

猜你喜欢

转载自blog.csdn.net/qq_36554582/article/details/81269005