ARM汇编 4.GNU伪指令、内联汇编

汇编伪指令格式

标号symbol(label)

注释符号:@

整行注释:#

语句分离:;

立即数前缀:# 或 $

在这里插入图片描述

分段:.section伪操作,用于自定义新的段

  • .text:代码段
  • .data:初始化的数据段
  • .bss:未初始化的数据段
  • .rodata:字符串和#define定义的常量
  • heap、stack、常量段

汇编程序的缺省入口是**_start标号**

数据定义

在这里插入图片描述

杂项伪操作符:

在这里插入图片描述

.global 定义全局符号

.align 指定数据对齐方式

.include 引入头文件,也可以#include

.incbin 伪操作:将一个二进制文件编译到当前文件,用于静态库

.rept:重复接下来的指令,以.rept开始,.end结束

.if伪操作:根据表达式的值来决定是否要编译下面的代码

.macro伪操作:将一段代码定义为一个整体,类似c里面的宏函数

举例:

在这里插入图片描述

伪指令

不是标注的ARM指令,在编译时会转化为对应的其他ARM指令(可能对应多条ARM指令)

LDR伪指令:

ldr r1,=val @ r1 = val 把val标号地址赋给r1

ldr r2, val @ r2 = *val 把val地址的内容给r2

可以实现长跳转:ldr pc, = 32位地址

可以解决非立即数的问题:ldr r0,=0x999 @0x999不是立即数

在编译后查看机器码:

在这里插入图片描述

通过基址变址寻址的方式实现,即将0x999放在了40008008地址的位置,牺牲一个4字节空间实现

内联汇编

内联汇编即在 C 中直接使用汇编语句进行编程,使程序可以在 C 程序中实现 C 语言不能完成的一些 工作

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

举例:

在这里插入图片描述

汇合汇编

使单独编译的C语言程序和汇编程序之间能够相互调用

ARM结构过程调用规范(APPCS):寄存器使用规则及相应名称、数据栈使用规则、参数传递的规则:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

例子如下:

在这里插入图片描述

参数传递是按照r0-r3寄存器进行传递,当超过4个参数,多余参数就要进栈,

返回值可以通过r0返回,当结果为64位时可以通过组合r0-r1方式,位数更多时需要调用内存,函数的返回地址存放在lr寄存器中。

相关推荐

  1. ARM GNU 汇编 “每日读书“

    2024-01-31 11:04:02       42 阅读
  2. 汇编清楚变量指定位

    2024-01-31 11:04:02       26 阅读
  3. x86汇编伪指令align和p2align

    2024-01-31 11:04:02       23 阅读
  4. ARM 汇编入门

    2024-01-31 11:04:02       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-31 11:04:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-31 11:04:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-31 11:04:02       87 阅读
  4. Python语言-面向对象

    2024-01-31 11:04:02       96 阅读

热门阅读

  1. Android Input系统之 InputMonitor 更新流程

    2024-01-31 11:04:02       40 阅读
  2. 自然语言处理的就业前景

    2024-01-31 11:04:02       51 阅读
  3. yum 报错 ZLIB_1.2.3.3 not defined in file libz.so.1

    2024-01-31 11:04:02       89 阅读
  4. GIT工作流程总结

    2024-01-31 11:04:02       52 阅读
  5. 【issue-halcon例程学习】lines_gauss.hdev

    2024-01-31 11:04:02       41 阅读