• ARM 汇编伪指令


    一、伪指令的意义

    • 伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。
    • 伪指令的意义在于指导编译过程。
    • 伪指令是和具体的编译器相关的,我们使用 gnu 工具链,因此学习 gnu 环境下的汇编伪指令。

    二、gnu 汇编中的一些符号

    • @ 用来做注释。可以在行首也可以在代码后面同一行直接跟,和C语言中//类似
    • # 做注释,一般放在行首,表示这一行都是注释而不是代码。
    • :以冒号结尾的是标号
    • . 点号在 gnu 汇编中表示当前指令的地址
    • # 立即数前面要加#或$,表示这是个立即数
    int a;
    
    
    while(1);
    
    flag:
    	b flag
    	
    	b .
    	
    IRQ_STACK_START:
    	.word	0x0badc0de
    等价于 unsigned int IRQ_STACK_START = 0x0badc0de;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    三、常用 gnu 伪指令

    .global _start		    @ 给_start外部链接属性
    .section .text		    @ 指定当前段为代码段
    .ascii .byte .short .long .word 
    .quad .float .string    @ 定义数据
    .align 4			    @ 以16字节对齐
    .balignl 16 0xabcdefgh 	@ 16字节对齐填充
    .equ			        @ 类似于C中宏定义
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    .align 4 @ 2的 4 次幂,16字节对齐
    .align 2 @ 2的 2 次幂, 4字节对齐

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

    0x00000008: .balignl 16, 0xdeadbeef
    0x0000000c: 0xdeadbeef
    0x00000010: 下一条指令


    偶尔会用到的 gnu 伪指令

    .end			@标识文件结束
    .include			@ 头文件包含
    .arm / .code32	@声明以下为arm指令
    .thumb / .code16	@声明以下为thubm指令
    
    • 1
    • 2
    • 3
    • 4

    最重要的几个伪指令

    ldr		大范围的地址加载指令
    adr	    小范围的地址加载指令
    adrl	中等范围的地址加载指令
    nop	空操作
    
    ARM 中有一个 ldr 指令,还有一个 ldr 伪指令
    一般都使用 ldr 伪指令而不用 ldr 指令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    adr 与 ldr
    • adr 编译时会被1条 sub 或 add 指令替代,而ldr编译时会被一条 mov 指令替代或者文字池方式处理;
    • adr 总是以 PC 为基准来表示地址,因此指令本身和运行地址有关,可以用来检测程序当前的运行地址在哪里
    • ld r加载的地址和链接时给定的地址有关,由链接脚本决定。

    注意:

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

    adr 和 ldr 的差别:ldr 加载的地址在链接时确定,而 adr 加载的地址在运行时确定;所以我们可以通过 adr 和 ldr 加载的地址比较来判断当前程序是否在链接时指定的地址运行。

  • 相关阅读:
    我常用的大模型和Prompt有哪些?
    轻量封装WebGPU渲染系统示例<16>- 使用GPU Compute计算(源码)
    2023互联网中秋礼盒大比拼!
    小兴教你做平衡小车-stm32程序开发(PWM)
    drone ci 是什么
    camunda_07_gateways
    R语言forcats包处理因子
    谷粒学苑_第三天
    ABAP学习笔记之——第七章:ABAP数据字典
    全球最受欢迎的「数字游民」城市竟然是它?
  • 原文地址:https://blog.csdn.net/weixin_42109053/article/details/128073257