首页 > 编程语言 >【ARM】汇编语言结构

【ARM】汇编语言结构

时间:2024-06-06 15:29:06浏览次数:22  
标签:汇编语言 text 等价 bss 内存 跳转 数据 ARM 结构

结构

连接器工作机制

对应C代码被编译为二进制执行文件的过程:

  1. C语言转换为汇编代码 file.c -> file.asm
  2. 汇编编译 产生 .o 文件 file.o 带有未解析地址的中间文件
  3. 连接器将.o 文件排列填入到对应的存储地址中, 并记录其函数和变量对应的地址, 使得其他函数能够跳转到该函数的入口地址.

汇编程序结构

一个典型的ARM汇编程序通常包含以下部分:

  1. 段定义:.text(代码段)、.data(数据段)和 .bss(未初始化数据段)。
  2. 符号声明:如全局符号(.global)和局部符号(标签)。
  3. 指令和数据定义:如汇编指令、伪指令和数据定义。

ld文件介绍

作用

.ld文件是作用在链接过程

功能结构
  1. 指定了存储区域的起始位置和大小,即内存布局

  2. 定义了程序入口

  3. 指定各存储区代码和数据的在固件上的存放位置

常用关键词
  1. ENTRY命令:运行一个程序时第一个被执行到的指令的"入口点"。
  2. MEMORY命令:内存块配置命令,一个连接脚本最多一个’MEMORY’命令。
  3. SECTIONS命令:’段’命令,段中又包含多个’节’, SECTIONS命令告诉连接器如何把输入节映射到输出节, 如何把输入节放入到内存中。
  4. KEEP()命令:防止垃圾收集机制把这个节排除在外,同时保证向量表在段中的位置处于最顶端。
  5. ALTGN命令:以多少位对齐,例如ALTGN(4)表示以4位对齐。
  6. .命令:一个点“.”可以用来获取当前内存地址。
  7. *:‘’是一个通配符,可以与所有文件名匹配。例如表达式(.text)表示所有输入文件的.text输入段。

段介绍

  1. bss段:Block Started by Symbol,存放程序中未初始化的全局变量和静态局部变量,通常这些变量会被操作系统或链接器初始化为0
    1. bss 段,不为数据分配空间,只是记录数据所需空间的大小;
  2. data段:data segment,存放程序中已初始化的全局变量和静态局部变量、非const的全局变量的一块内存区域
    1. const全局变量一般放到了rodata段,初始化为零的全局变量可能被编译器优化到 bss段
  3. text段:code segment/text segment,存放程序执行代码的一块内存区域,程序执行时CPU会读取并执行的机器指令

注:

1.text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。
2.text段一般也包含rodata段,text段可以存放到flash中;data段也放到flash中,运行时由flash中加载到SRAM;bss段在运行时系统创建,存放到RAM中

程序运行概念介绍

  1. 堆:用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减
    1. 当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);
    2. 当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
  2. 栈:用于存放程序中的非静态局部变量和函数调用时的临时变量(可以把堆栈看成一个寄存、交换临时数据的内存区)

指令

ARM汇编指令格式

<opcode> <destination>, <operand1>, <operand2>
  • <opcode>:操作码,表示要执行的操作,例如:ADDMOV 等。
  • <destination>:目标寄存器,用于存储操作的结果。
  • <operand1> 和 <operand2>:操作数,可以是寄存器或立即数(用 # 表示)。

指令集

指令

含义

指令

含义

MOV

移动数据

EOR

异或

MVN

取反码移动数据

LDR

加载数据

ADD

数据相加

STR

存储数据

SUB

数据相减

LDM

多次加载

MUL

数据相乘

STM

多次存储

LSL

逻辑左移

PUSH

压栈

LSR

逻辑右移

POP

出栈

ASR

算术右移

B

分支跳转

ROR

循环右移

BL

链接分支跳转

CMP

比较操作

BX

分支跳转切换

AND

比特位与

BLX

链接分支跳转切换

ORR

比特位或

SWI/SVC

系统调用

栈指令

栈类型

压栈

弹栈

满栈降序(FD,Full descending)

STMFD(等价于STMDB,操作之前递减)

LDMFD(等价于LDM,操作之后递增)

满栈增序(FA,Full ascending)

STMFA(等价于STMIB,操作之前递增)

LDMFA(等价于LDMDA,操作之后递减)

空栈降序(ED,Empty descending)

STMED(等价于STMDA,操作之后递减)

LDMED(等价于LDMIB,操作之后递增)

空栈增序(EA,Empty ascending)

STMEA(等价于STM,操作之后递增)

LDMEA(等价于LDMDB,操作之前递减)

标签:汇编语言,text,等价,bss,内存,跳转,数据,ARM,结构
From: https://blog.csdn.net/weixin_42167433/article/details/139437810

相关文章

  • golang接口请求结构体验证器Validator实现
    一、前提:认识reflect.TypeOf及reflect.ValueOfTypeOf:动态的获取从函数接口中传进去的变量的类型,如果为空则返回值为nil(获取类型对象)可以从该方法获取的对象中拿到字段的所属类型,字段名,以及该字段是否是匿名字段等信息。还可以获取到与该字段进行绑定的tag。ValueO......
  • 在Linux中,体系结构是什么?
    Linux操作系统的体系结构通常指的是它如何组织和管理内部组件以及与硬件的交互方式。Linux的体系结构可以分为几个关键层次:1.内核空间(KernelSpace)内核:Linux的核心,负责管理系统资源,包括CPU调度、内存管理、文件系统、设备驱动等。系统调用:内核提供给用户空间程序的接口,允许用......
  • 若依框架构造树形结构数据
    若依框架构造树形结构数据一、数据库表结构以分组为例,仅创建分组所需字段,其余业务需要字段后续再添加即可SETNAMESutf8mb4;SETFOREIGN_KEY_CHECKS=0;--------------------------------Tablestructureforggroup_data------------------------------DROPTABLE......
  • 马达对应的actuator结构体分析
    ​1.文件:mm-camera2/media-controller/modules/sensors/actuator/actuator.h中对actuator_data_t进行了如下定义:这个结构体是actuator马达控制的最外层的数据结构。typedefstruct{  int32_tfd;  actuator_ctrl_t*ctrl;  int16_tcurr_step_pos;  ......
  • 递归在多级数据结构中的简单应用
    哈喽,我是小码,半年多没更新了,这段时间换了新工作,工作也很忙。后续会尽量多写点,坚持确实是一件很难,很酷的事情。最近在公司负责开发商品有关的开发,商品包含类型、款式等属性,而类型可能有一级类型、二级类型甚至是三级类型,针对这种多级分类,这就就不好使用简单的查询了。之前也写了一......
  • 含税仅498元起!复旦微ARM + FPGA SoC全国产工业核心板,性价比真高!
     ......
  • 数据结构基础篇(6)
    二十三、队列的表示和操作的实现相关术语队列是仅在表尾进行插入操作,在表头进行删除操作的线性表表尾既a~n段,称对尾;表头a~1段,称队头它是一种先进先出(FIFO)的线性表入队:插入元素出队:删除元素队列的存储结构为链对或顺序对(常用循环顺序队)队列的常见应用脱机打印输......
  • [转][翻译]深入理解Win32结构化异常处理(四)
     如果你已经走了这么远,不把整个过程讲完对你有点不公平。我已经讲了当异常发生时操作系统是如何调用用户定义的回调函数的。我也讲了这些回调的内部情况,以及编译器是如何使用它们来实现__try和__except的。我甚至还讲了当某个异常没有被处理时所发生的情况以及系统所做的扫尾工......
  • C语言数据结构实现-单链表表基本操作
    链表插入元素同顺序表一样,向链表中增添元素,根据添加位置不同,可分为以下3种情况:插入到链表的头部(头节点之后),作为首元节点;插入到链表中间的某个位置;插入到链表的最末端,作为链表中最后一个数据元素;虽然新元素的插入位置不固定,但是链表插入元素的思想是固定的,只需做以下两步操......
  • mysql阶段02 数据库基本操作, 误删用户案例解决, 数据库体系结构, mysql服务构成, mys
    一、数据库基本操作1.设置数据库密码[root@db03~]#mysqladmin-urootpassword'123456'2.使用密码登录#1.正确的登录方式[root@db03~]#mysql-uroot-p123456[root@db03~]#mysql-uroot-p123456#2.错误的登录方式[root@db03~]#mysql-uroot-p123456#3......