ARMGNU伪指令

news/2025/2/12 18:19:57

符号定义伪指令

.global,.local,.set,.equ

.global

使得符号对连接器可见,变为对整个工程可用的全局变量

.global symbol

.local

表示符号对外部不可见,只对本文件可见

.local symbol

.set

给一个全局变量或局部变量赋值,和.equ的功能一样

.set symbol expr
.set start, 0x40
.set start, 0x50
mov r1, #start      ;r1里面是0x50

.equ

.set一样,只是格式不同

symbol .equ  expr
start  .equ, 0x40
start  .equ, 0x50
mov r1, #start      ;r1里面是0x50

数据定义伪指令

.byte,.short,.long,.quad,.float,.string,.asciz,.ascii,.rept

.byte

在存储器中分配1个字节,用指定的数据对存储单元进行初始化

label:  .byte   expr    ;label是程序标号,expr可以是-128~255的数字,也可是字符
a:  .byte   #1  ;等价于C中的char a=1;

.short

在存储器中分配2个字节,用指定的数据对存储单元进行初始化

a: .short 0x1234

.word / .long

在存储器中分配4个字节,用指定的数据对存储单元进行初始化

a: .word 0x12345678

.long

在存储器中分配个字节,用指定的数据对存储单元进行初始化

.quad

在存储器中分配8个字节,用指定的数据对存储单元进行初始化

a: .quad 0x12345678 ;等价于C中的long a=0x1234567812345678

.float

在存储器中分配4个字节,用指定的浮点数据对存储单元进行初始化

a: .float 1.11

.space/.skip

用于分配一块连续的存储区域并初始化为指定的值,如果后面的填充值省略不写则在后面填充为0;

label: .space size,expr     ;expr可以是4字节以内的浮点数 
a:  space 8, 0x1

.string

定义一个字符串,默认是string8,还有string16,string32,string64

a: .string "hello world!"

.rept

重复执行接下来的指令,以.rept开始,以.endr结束

.rept cnt   ;cnt是重复次数
...
.endr

汇编控制伪操作

流程控制伪指令主要yy.if .else .endif .macro .endm .exitm

.if .else .endif

.if logical-expression
...
.elseif logical-expression2
...
.else
...
.endif

.macro .endm .exitm

该伪指令可以将一段代码定义为一个整体,称为宏指令,然后就可以在程序中通过宏指令多次调用该段代码,而.exitm指令用来退出当前的宏指令,宏指令可以使用一个或多个参数,当宏操作被展开时,这些参数被相应的值替换。
包含在.macro。endm之间的指令序列称为宏定义体。在宏定义体的第一行应声明宏的原型,包含宏名所需的参数,然后就可以在汇编程序中通过宏名来调用该指令序列,在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列代替程序中的宏调用,并将实际参数的值传递给宏定义中的形式参数

.macro macroname macargs ...
;code
.endm

杂项

.align      用于使程序当前位置满足一定的对齐方式
.section    用来定义一个段的伪指令
.data       用来定义一个数据段
.text       用来定义一个代码段
.include    用来包含一个头文件   
.arm        定义以下代码使用arm指令集编译
.code 32    同.arm
.code 16    同.thumb
.thumb      定义以下代码使用thumb指令集编译
.extern     用于声明一个外部符号,用于兼容性其他汇编
.weak       用于声明一个弱符号,如果这个符号没有定义,编译就忽略,而不会报错
.end        表示汇编结束

ADR

把标签所在的地址加载到寄存器中,这个指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。当地址值是字节对齐的时候,取值范围是-255~255B;当地址值是字对齐的时候,取值范围为-1020~1020B。当地址值是16字节对齐时,取值范围更大。 该指令等价于add <reg>, pc , offset

ADR <reg> <label>

ADRL

用于将中等范围地址读取到寄存器中

ADRL <reg> <label>

LDR

装载一个32位的常数和一个地址寄存器

LDR reg, =expr

reg:目标寄存器
expr:32位常量表达式。汇编器根据expr的取值情况,对LDR伪指令做如下处理:

  1. 当expr表示的指令地址值没有超过MOV指令或MVN指令的地址取值范围时,汇编器用一对MOV和MVN代替LDR指令
  2. 当超过了的时候,汇编器将常数放入缓存吃,同时用一条基于PC的LDR读取该常数
LDR R3,=0xff0
;将常熟0xff0读到内存中相当于MOV R3, #0xff0LDR R1,=0xfff   
;将常数0xfff读到内存,
;相当于LDR R1,[pc, offset_to_litpool]  ... litpool DCD 0xfffLDR R2, =place  
;将place标号的地址读入到R1中
;相当于LDR R1,[pc, offset_to_litpool]  ... litpool DCD place

转载于:https://www.cnblogs.com/xiaojiang1025/p/6063516.html


https://dhexx.cn/news/show-1703087.html

相关文章

高效项目管理的十大要诀

当前社会越来越倾向于以项目为中心&#xff0c;通过良好的项目管理来提高工作效率是非常有效的。但是对大多数公司来说&#xff0c;转向以项目为导向的管理结构将会带来极大的变化&#xff0c;尽管变化本身会带来利益&#xff0c;但是人们却往往抵制变化。一定的规则和指导方针…

一文带你看懂Python数据分析利器——Pandas的前世今生

本文将从Python生态、Pandas历史背景、Pandas核心语法、Pandas学习资源四个方面去聊一聊Pandas&#xff0c;期望能带给大家一点启发 Python生态里的Pandas 五月份TIOBE编程语言排行榜&#xff0c;Python追上Java又回到第二的位置。Python如此受欢迎一方面得益于它崇尚简洁的编程…

【Unity/Kinect】Kinect实现UI控件的点击

用体感来实现UI控件的点击&#xff0c;如点击按钮。 做法&#xff1a;用一个图片表示左手手掌&#xff0c;图片位置追踪左手手掌移动&#xff0c;当手掌位于UI控件的矩形内时&#xff0c;握拳表示点击该控件。 using UnityEngine; using System.Collections; using UnityEngine…

项目管理九大知识体系

项目管理九大知识体系&#xff1a; 范围管理&#xff1a;项目为何总是做不完&#xff1f;范围管理要界定 做过项目的人可能都会有这样的经历&#xff1a;一个项目做了很久&#xff0c;感觉总是做不完&#xff0c;就像一个“无底洞”。用户总是有新的需求要项目开…

Java小白从入门到精通,Java零基础入门看这一篇就够了

作为刚刚接触java的小白&#xff0c;今天这篇文章的目的是帮助大家快速入门java&#xff0c;少走弯路 如何快速入门Java&#xff1f; 一、作为刚接触Java的新手&#xff0c;先了解Java的基础。 Java 基本语法、Java 平台应用、Java的核心概念&#xff1a;JVM、JDK、JRE以及Java…

自然语言10_分类与标注

sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare http://www.tuicool.com/articles/feAfi2 NLTK读书笔记 — …

情商管理

国际标准情商测试题情商&#xff08;EQ&#xff09;&#xff1a;一个近几年才提出来相对智商&#xff08;IQ&#xff09;而言的心理学概念&#xff0c;是情绪的商数&#xff0c;或称情绪智慧&#xff1b;指人的乐观与悲观&#xff0c;急躁与冷静&#xff0c;大胆与恐惧&#xf…

Java是什么?Java能干什么工作?

Java是一种为多个平台生成软件的编程语言。由Sun Microsystems的前计算机科学家James A. Gosling在20世纪90年代中期开发的。编译的代码可在大多数操作系统上运行。 Java是一门面向对象编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承…

什么是颜色

什么是颜色   这个解释感觉很是不错的&#xff0c;颜色或色彩是通过眼、脑和我们的生活体验所产生的一种对光的视觉效应。嗯&#xff0c;简单点说&#xff0c;颜色就是人对光的一种感觉&#xff0c;有大脑产生一种感觉。感觉是很主观的东西&#xff0c;你怎么确定你看到的颜色…

20110722问题点

异步发送Email 总线程数当前main线程基它并发线程 eventTarget与formValidatorprotected void btnSubmit_Click(object sender, EventArgs e) { MemberInfo info this.GetInfo(); this.Validate(info);Thread dntAsync new Thread(new ParameterizedThreadS…