zoukankan      html  css  js  c++  java
  • Uboot中汇编指令

    LDR(load register)指令将内存内容加载入通用寄存器

    ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。比如想把数据从内存中某处读取到寄存器中,只能使用ldr。
    ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。

    另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,
    比如: ldr r0, =0x12345678 这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。

    MRS和MSR

    在ARM处理器中,只有MRS(Move to Register from State register)指令可以对状态寄存器CPSR和SPSR进行读操作。
    通过读CPSR可以获得当前处理器的工作状态。读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有SPSR寄存器)。
    例如:
    MRS R1,CPSR; 将CPSR状态寄存器读取,保存到R1中
    MRS R2,SPSR; 将SPSR状态寄存器读取,保存到R2中
    通过MRS指令可以取得状态寄存器里的值,然后比较其模式位M[4:0]的值判断当前所处模式,当然也可以比较其它相应位了解当前CPU的状态。
    同样,在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。
    由于xPSR寄存器代表了CPU的状态,其每个位有特殊意义,在执行对xPSR状态寄存器写入时(读取时不存在该用法),为了防止误操作和方便记忆,将xPSR里32位分成四个区域,每个区域用小写字母表示:
    c 控制域屏蔽 psr[7..0]
    x 扩展域屏蔽 psr[15..8]
    s 状态域屏蔽 psr[23..16]
    f 标志域屏蔽 psr[31..24]
    注意:区域名必须为小写字母
    向对应区域进行执行写入时,使用xPSR_x可以指定写入区域,而不影响状态寄存器其它位,如:
    使能IRQ中断:
    ENABLE_IRQ
    MRS R0, CPSR;  将CPSR寄存器内容读出到R0
    BIC R0, R0, #0x80;  清掉CPSR中的I控制位
    MSR CPSR_c, R0;   将修改后的值写回CPSR寄存器的对应控制域
    MOV PC, LR;      返回上一层函数

    禁用IRQ中断:
    DISABLE_IRQ
    MRS R0, CPSR ;       将CPSR寄存器内容读出到R0
    ORR R0, R0, #0x80; 设置CPSR中的I控制位
    MSR CPSR_c, R0 ;   将修改后的值写回 CPSR寄存器的对应控制域
    MOV PC, LR ;      返回上一层函数

    CMP是比较指令

    cmp的功能是相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器来得知比较结果.
    cmp指令格式: cmp 操作对象1,操作对象2
    功能: 计算操作对象1 - 操作对象2 但不保存结果,仅仅根据计算结果对标志寄存器进行设置.比如cmp ax,ax 是做ax - ax 的运算,结果为0,但并不在ax中保存,仅影响flag的相关各位.
    指令执行后: zf = 1,pf = 1,sf = 0,cf = 0,of = 0;
    下面的指令:
    mov ax,8
    mov bx,3
    mov ax,bx
    执行后: (ax)= 8,zf = 0,pf = 1,sf = 0, cf = 0, of = 0

    MOVENE指令

    MOV是单纯的传送指令。
    MOVNE先判断条件NE (不相等)则转移,可以看作是两条指令
    NE=NOT EQUAL 不相等

    BL指令

    bl是arm汇编中用来调用子程序的指令,它把bl后面一条指令的地址放到R14寄存器里,R15寄存器(PC当前指针地址)就设置成要跳往的地址。这样在这个子程序返回时,再mov PC,
    R14就可以返回到bl后面的地址了。
    b不一样,b是直接 mov PC, 目标地址; 而不保存其后的地址到R14。

  • 相关阅读:
    Jquery 总结的几种常用操作
    Mybatis 一对多
    HTML 子父窗口 iframe 超时 返回首页
    Struts 标签
    Spring + Mybatis 基于注解的事务
    机器学习实战-数据探索(变量变换、生成)
    机器学习实战-数据探索(变量变换、生成)
    Pandas matplotlib 无法显示中文 Ubuntu16.04
    Pandas matplotlib 无法显示中文 Ubuntu16.04
    Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so.
  • 原文地址:https://www.cnblogs.com/debruyne/p/9209945.html
Copyright © 2011-2022 走看看