• 常用汇编指令小结


    因为RT-Thread的移植会涉及到上下文切换代码及中断处理代码之类的移植,而且在编程指南中的“GNU GCC移植”和“STM32说明”两节也都展示了不少汇编代码,所以了解一些基本汇报指令还是有必要的。

    * cpsr current program status register (程序状态寄存器)
    * spsr Saved Process Status Registers (程序状态保存寄存器)

    关于cpsr与spsr,详细描述可参见:hi.baidu.com/yanxuex29/blog/item/ace566313cf18251ad4b5fd8.html

    fd Full Descending 满减栈标示
    stmfd 入栈,栈指针向下移动一个位置
    ldmfd 出栈,栈指针向上移动一个位置

    mrs 状态寄存器到通用寄存器的传送指令
    msr 通用寄存器到状态寄存器的传送指令
    msr cpsr, r0  /* 复制r0到cpsr中 */
    mrs r0, cpsr /* 复制cpsr到r0中 */

    mov 数据传送指令,可以把一个寄存器的值赋给另外一个寄存器,或者把一个常数赋给寄存器
    mov r1, r2  /* r1 =  r2 */
    mov r1,#1024 /* r1 = 1024 */

    ldr 当其第二个参数前面有'='时表示伪指令,否则表内存访问指令;伪命令,不是真实存在的指令,编译器会把它扩展成真正的指令;如果该常数能用“立即数”来表示,则使用mov指令,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。
    str 内存访问指令
    ldr r1, =1024   /* r1 = 1024 */
    ldr r1, [r2, #4] /* 将地址为r2+4的内存单元数据读取到r1中 */
    ldr r1,[r2] /* 将地址为r2的内存单元数据读取到r1中 */
    ldr r1,[r2], #4 /* 将地址为r2的内存单元数据读取到r1中,然后r2=r2+4 */
    str r1 ,[r2, #4] /* 将r1的数据保存到地址为r2+4的内存单元中 */
    str r1, [r2] /* 将r1的数据保存到r2所指向的地址中 */
    str r1, [r2],#4 /*将r1的数据保存到地址为r2的内存单元,然后r2= r2+4 */

    cmp 比较指令, 会更新CPSR中的相应条件标志位
    nop 空操作伪指令, 可用于延进操作
    beq
    BEQ LOOP  /* 条件跳转到 LOOP 标号处 */

    add 加指令
    sub 减指令
    add r1, r2, #1  /* r1=r2+1 */
    sub r1, r2, #1 /* r1=r2-1 */

    orr 逻辑或操作指令
    and/ands 逻辑与操作指令
    orr R0,R0,#x0F  /* 将 R0 的低 4 位置 1 */
    ands R0,R0,#x01 /* R0=R0&0x01,取出最低位数据 */
    and R2,R1,R3 /* R2=R1&R3 */

    b 跳转指令
    bl 带链接的跳转指令,BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR/链接寄存器)。由于BL指令保存了下条指令的地址,因此使用指令“MOV PC ,LR”即可实现子程序的返回。
    bx 带状态切换的跳转指令

    blo
    ldrlo
    strlo

    * sp Stack Pointer
    * lr Link register
    * pc Program Counter
    * alu Arithmetic and Logic Unit
    * swi Software Interrupt Instruction
    * fiq Fast Interrupt Request
    * irq Interrupt Request
    * lsl Logical Shift Left
    * lsr Logical Shift Right
    * asr Arithmetic Shift Right
    asr #n  /* 算术右移 n 位(1≤n≤32) */
    lsl #n /* 逻辑左移 n 位(1≤n≤31) */
    lsr #n /* 逻辑左移 n 位(1≤n≤32) */
    ror #n /* 循环右移 n 位(1≤n≤31) */

    关于后缀s(如上面的 and 和 ands),为可选后缀;若指定“s”,则根据指令执行结果更新CPSR中的条件码。

    更多详细信息,可参阅附件:常用ARM指令即汇编

    还有一篇:blogold.chinaunix.net/u/23353/showart_1770984.html
  • 相关阅读:
    使用命令安装laravel 项目
    laravel如何输出最后一条执行的SQL
    Laravel5.4 队列简单配置与使用
    PHP使用RabbitMQ实例
    初识RabbitMQ,附RabbitMQ+PHP演示实例
    Laravel 5.3 单用户登录的简单实现
    redis+thinkphp5的注册、登陆、关注基础例子
    Laravel 5.3 单用户登录的简单实现
    php面试题汇总
    (转)php读取文件使用redis的pipeline导入大批量数据
  • 原文地址:https://www.cnblogs.com/wzc0066/p/2949295.html
Copyright © 2020-2023  润新知