zoukankan      html  css  js  c++  java
  • Arm伪指令

    伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。

    伪指令的意义在于指导编译过程。

    伪指令是和具体的编译器相关的,我们使用gun工具链,因此学习gun环境下的汇编伪指令。

    gun汇编中的一些符号:

    @  用来做注释

    #    也用来做注释,一般用于行首,表示这一行都是注释而不是代码

    :  以冒号结尾的是标号

    .    在gun汇编中表示当前指令的地址

    #   立即数前面要加#或$,表示这是个立即数

    .global _start  @给_start外部链接属性

    .section .text  @指定当前段为代码段

    .ascii .byte .short .long .word

    .quad .float .string@定义数据

    .align 4    @以16字节对齐

    .balignl 16 0x12345678  @16字节对齐填充

    .equ    @类似C中宏定义

    例如:

    IRQ_STACK_START:

      .word  0x12345678

    等价于 unsigned int IRQ_STACK_START = 0x122345678;

    .balignl 16,0xdeadbeef  @对齐+填充

    b表示位填充;align表示要对齐;l表示long,以4字节为单位填充;16表示16字节对齐;0xdeadbeef是用来填充的原料

     

    .end  @表示文件结束

    .include  @头文件包含于

    .arm/ .code32 @声明以下为arm指令

    .thumb/ .code16 @声明以下为thumb指令

    ldr  大范围的地址加载指令

    adr  小范围的地址加载指令

    adrl  中等范围的地址加载指令

    nop  空操作

    ARM指令中有一个ldr指令,也有一个ldr伪指令。一般都使用伪指令。

    ldr指令:  ldr r0,#0xff

    ldr伪指令:    ldr r0,=0xfff  @涉及到合法/非法立即数,涉及到ARM文字池

    adr与ldr

    adr编译时会被1条sub或add指令替代,而ldr编译时会被条mov指令 替代或者文字池方式处理;
     
    adr总 是以PC为基准来表示地址,因此指令本身和运行地址有关,可以用来检测程序当前的运行地址在哪里;

    ldr加载的地址和链接时给定的地址有关,由链接脚本决定。 
  • 相关阅读:
    设计模式之模式方法模式
    Extjs 分页多选的实现
    设计模式之策略模式
    oracle 12c 报错 ora-03137 来自客户机的格式错误的TTC包被拒绝
    设计模式之状态模式
    设计模式之装饰者模式
    设计模式之代理模式
    设计模式之单例模式
    从reduce函数说起...
    Django View(视图系统)
  • 原文地址:https://www.cnblogs.com/sanshijvshi/p/10723800.html
Copyright © 2011-2022 走看看