ArmV8常用汇编指令

news/2025/3/19 21:21:02/

1.syntax用法

        GNU汇编器的.syntax

        .syntax命令是ARM架构独有的命令,语法为 .syntax [unified | divided];作用是在汇编ARM指令时,指定按照什么样的语法规则进行汇编。如果在编写汇编语言时不使用该命令指定语法规则,那么默认采用.syntax divided,此时使用旧的汇编风格,ARM和THUMB指令有着各自的语法。正是在这种情况下,汇编器报了第1节中所说的错误,可能是指令采用了新的汇编风格,和旧的不兼容。

  • 立即数不需要#前缀
  • 可能会出现IT指令,如果出现,则根据后面的条件码进行验证。在ARM模式下,它不会生成机器码,而在THUMB模式下则会生成机器码
  • 对于ARM指令,条件码总是出现在指令的最后;对于THUMB指令,条件码可以被使用,但仅限于IT指令的范围内
  • V6T2架构(及更高版本)的所有新指令都可用(这些指令中,divided语法仅支持少部分)
  • 支持.N和.W后缀

    示例如下:

    // Enable UAL syntax

    .syntax unified

2 以 . 开头的名称

        汇编程序中以.开头的名称并不是指令的助记符,不会被翻译成机器指令,而是给汇编器一些特殊指示,称为汇编指示(Assembler Directive)或伪操作(Pseudo-operation),由于它不是真正的指令所以加个“伪”字。.section指示把代码划分成若干个段(Section),程序被操作系统加载执行时,每个段被加载到不同的地址,操作系统对不同的页面设置不同的读、写、执行权限。GNU伪指令具体可参考Using as - Table of Contents (gnu.org)

        例如.section .text.boot, "ax", %progbits

        Section 类型如下

        表示定义文本段boot,ax表示权限,ax是 allocation execute的缩写,表示该节区可分配并且可执行;%progbits是type字段的标记:PROGBITS: 程序内容,包含代码、数据、调试相关信息

        .type symbol,%type:指定symbol的类型,如下

.global 表示该symbol对链接文件是可见的,如果在部分程序中定义了符号,那么它的值将对与它链接的其他部分程序可用。否则,symbol将从链接到同一程序的另一个文件中的同名符号获取其属性。

.weak,弱符号:其他同名符号优先级高于该符号;当其他同名不可用时才使用该符号里的定义。

.equ 类似宏定义,将常量或者其他什么分配给一个符号;

上述语法的使用方法示例:

 

3 ARM 汇编语法格式

  • 注释

在arm汇编中,注释可以用// 或者#来注释整行,也可以用/* */来跨行注释

  • 符号

        符号symbol是核心概念,是一个程序的桥梁,程序员使用符号来命名各种内容,链接器使用符号进行链接,调试器使用符号进行定位调试。符号常用字母、数字、_、.、$进行表示。全局符号使用.global,本地符号使用.L

4 常用伪指令

伪指令,用于给汇编器发送命令,让汇编器按照既定命令进行汇编,也就是说,在汇编完成后,伪指令的使命就结束了。常见伪指令如下:

4.1 数据定义伪指令

.byte

8位数当做数据嵌入汇编

.hword/.short

16位数当做数据嵌入汇编

.long/.int

32位数当做数据嵌入汇编

.word

32位数当做数据嵌入汇编

.quad

64位数当做数据嵌入汇编

.float

浮点数当做数据嵌入汇编

.rept .endr

重复执行伪操作

.rept 10

.byte 3

.endr

==  .byte 3

   .byte 3

   .byte 3

.equ

给符号赋值

.equ data1,10 //给data1符号赋值10

4.2 函数相关伪指令

.global

定义全局符号,可以是函数或者全局变量

.include

引用头文件

.if .else .endif

控制语句

.ifdef symbol

判断symbol是否定义

.ifndef symbol

判断symbol是否没有定义

.ifc str1,str2

判断字符串是否相等

.ifeq exp

判断exp是否为0

.ifge exp

判断exp是否大于等于0

.ifle exp

判断exp是否小于等于0

.ifne exp

判断exp是否不等于0

4.3 段相关伪指令

        .section,这个比较容易和ld文件搞混。

        这里就将汇编,.section表示在该section里的汇编会被链接到某个段里,常用格式如下

        .section name,”flags”

        .section 伪指令定义的段会一个段的名称开始,以下一个段或者文件的结尾结束;

        .pushsection和.popsection

        二者配对使用,将代码链接到指定的段,其他代码还保留在原来的段中;

4.4 宏相关伪指令

        .macro name args ...

        宏名称、宏参数。

        当宏里使用参数时,需加前缀”\”

        例如

.macro add a1,a2

Add r0,\a1,\a2

.endm

5.ARMV8-R 指令编码格式

这里讨论A32指令编码格式

A32指令包含4-bit的condition code,状态如下:

        根据不同的op0/1可以解码成不同的指令集,如下:

        注意这是给机器识别的指令。那我们实际写汇编该怎么弄呢?我们下一篇挨个分析:


http://www.ppmy.cn/news/1223593.html

相关文章

Salmon-超快速、准确的基因丰度计算

文章目录 Salmon简介文章引用及适用物种获取转录组并建立索引比较salmon和coverm定量差异 Salmon简介 Salmon 是一款速度极快的程序,能从 RNA-seq 数据中生成高精度的转录本水平的量化估计值。Salmon 通过一系列不同的创新实现了其准确性和速度,包括使用…

vnodeToString函数把vnode转为string(innerhtml)

函数 function vnodeToString(vnode) {// 如果是文本节点,直接返回文本内容if ([string, boolean, undefined, null, number].includes(typeof vnode)) {return vnode;}// 转换节点的属性为字符串形式const attrs Object.keys(vnode.attrs || {}).map((key) > …

DDD落地:从腾讯视频DDD重构之路,看DDD极大价值

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 谈谈你的DDD落地经验? 谈谈你对DDD的理解&#x…

9款AI让你在2分钟内创建任何东西

1、免费AI绘画:LeonardoAi一个免费的 Midjourney 替代品,能够快速创建高品质和风格统一的视觉图片,帮你释放创造力。 2、 模板编辑AI:Canva 将所有AI的强大功能汇聚于一处,为你的工作流程注入超级动力。 3、构建网站&…

【超好用的工具库】hutool-all工具库的基本使用

简介(可不看): hutool-all是一个Java工具库,提供了许多实用的工具类和方法,用于简化Java开发过程中的常见任务。它包含了各种模块,涵盖了字符串操作、日期时间处理、加密解密、文件操作、网络通信、图片处…

6. hdfs的命令操作

简介 本文主要介绍hdfs通过命令行操作文件 操作文件有几种方式,看个人习惯 hdfs dfs hdfs fs hadoop fs个人习惯使用 hadoop fs 可操作任何对象,命令基本上跟linux命令一样 Usage [hadoophadoop01 ~]$ hadoop fs Usage: hadoop fs [generic option…

Linux系统下安装RabbitMQ超简单教程(非详细)(Centos8)

文章目录 一、下载所需安装包二、安装三、启动rabbitmq四、添加远程用户五、图形化访问六、修改rabbitmq的启动端口和管理端口(没有这个需求就不用看了)七、需要注意版本问题可能遇到的错误和解决方式version GLIBC_2.34 类型错误undefined function rab…

Mybatis中limit用法补充

limit a,b a是从第a1条数据开始,b是指读取几条数据 例如:select * from table limit 0,10 这句sql语句是说从表中获取第1条开始的10条记录 前端将page:页码    pageSize:每页多少条    这两个参数,传到后台。    通过这两个参数&am…