ARMGNU伪指令
符号定义伪指令
.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相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。当地址值是字节对齐的时候,取值范围是-255255B;当地址值是字对齐的时候,取值范围为-10201020B。当地址值是16字节对齐时,取值范围更大。 该指令等价于add <reg>, pc , offset
ADR <reg> <label>
ADRL
用于将中等范围地址读取到寄存器中
ADRL <reg> <label>
LDR
装载一个32位的常数和一个地址寄存器
LDR reg, =expr
reg:目标寄存器
expr:32位常量表达式。汇编器根据expr的取值情况,对LDR伪指令做如下处理:
- 当expr表示的指令地址值没有超过MOV指令或MVN指令的地址取值范围时,汇编器用一对MOV和MVN代替LDR指令
- 当超过了的时候,汇编器将常数放入缓存吃,同时用一条基于PC的LDR读取该常数
LDR R3,=0xff0
;将常熟0xff0读到内存中相当于MOV R3, #0xff0
LDR R1,=0xfff
;将常数0xfff读到内存,
;相当于LDR R1,[pc, offset_to_litpool] ... litpool DCD 0xfff
LDR R2, =place
;将place标号的地址读入到R1中
;相当于LDR R1,[pc, offset_to_litpool] ... litpool DCD place
ARMGNU伪指令的更多相关文章
- ARM伪指令,王明学learn
ARM伪指令 在ARM汇编语言程序中里,有一些特殊指令助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作.伪指令在元程序中的作用是为完成汇编 ...
- 8.adr与ldr伪指令的区别
ldr和adr都是伪指令,区别是ldr是长加载.adr是短加载. 重点:adr指令加载符号地址,加载的是运行时地址: ldr指令加载符号地址时,加载的是链接地址.
- pragma伪指令
pragma伪指令 通过pragma伪指令告诉编译器如何对待特定的函数.对象或代码段.TMS320C28x C/C++编译器支持如下形式的pragma伪指令: CODE_SECTION(func,“s ...
- 0x03伪指令
等号伪指令 = 相当于指定常量,由等号定义的符号常量不占用存储空间. count = 1234 可以重复定义多次,EQU则不容许 EQU伪指令 1.常量名 EQU 表达式 NUMBER EQU 10* ...
- ARM7ldr指令与ldr伪指令
ldr伪指令的第二个操作数之前有个=,意思是第一个操作书 = 第二个操作数,相当明了 核心就在于对于用.word指令在.text段里另外定义一段内存,用ldr r0,[pc + x(可以算出.text ...
- LDR伪指令与ADR伪指令的区别
测试代码 ldr r0, _start adr r0, _start ldr r0, =_start nop mov pc, lr _start: nop 设置代码的起始地址为 0x0c008000, ...
- ARM学习笔记9——ARM汇编汇编语言中的伪指令
ARN汇编器支持ARM伪指令,这些伪指令在汇编阶段被翻译成ARM或Thumb指令.ARM伪指令包含ADR.ADRL.MOV32和LDR.一.ADR伪指令 1.作用 ADR是小范围地址读取伪指令,基于P ...
- Keil伪指令
Keil伪指令 目录 Keil伪指令... 1. ALTNAME. 2 2. BIT. 2 3. BSEG.. 2 4. CODE. 2 5. CSEG.. 2 ...
- KEIL 伪指令
//为了大家查找方便,命令按字母排序:0.ALTNAME 功能: 这一伪指令用来自定义名字,以替换源程序中原来的保留字,替换的保留字均可等效地用于子程序中. 格式: ALTNAME 保留字 自定义名 ...
随机推荐
- 基本概念----Beginning Visual C#
更多相关文章,见本人的个人主页:zhongxiewei.com 变量 注释方式:// 注释在这里和/* 注释在这里 */ 整形变量的类型: Type Alias for Allowed Values ...
- PopupWindow 点击外部和返回键无法消失背后的真相(setBackgroundDrawable(Drawable background))
刚接手PopupWindow的时候,我们都可能觉得很简单,因为它确实很简单,不过运气不好的可能就会踩到一个坑: 点击PopupWindow最外层布局以及点击返回键PopupWindow不会消失 新手在 ...
- SpringMVC 参数注入
写一个web service, 总是400. 说是request有问题,server不识别.然而检查了很多次都没问题.最终问题指向spring对参数的解析和注入. 一个controller中可以自定义 ...
- 利用JsonConvert.SerializeObject()实现类对象的json化
现阶段的项目是采用前后端分离的思想,前端使用的是Angular.JS,后端使用ABP框架,在后端我们通过WebAPI技术来向前端提供json数据.以前是通过MVC来写前端的代码,感觉后端有点在控制前端 ...
- 自己实现简单的AOP(三) 实现增强四项基本功能
前面的两篇随笔,都是只是个铺垫,真正实现增强四项基本功能的重头戏,在本篇随笔中, 本文将通过AOP实现如下的四个基本功能: /// <para>1.自动管理数据库连接[可选]</pa ...
- 数据库排序sql,order by
一开始我认为 SELECT * FROM dbo.T_User ORDER BY CreateTime ,IsDel DESC 的执行顺序是先按创建时间倒序排序,再按isdel倒序排序,所以我就没再S ...
- C#封装程序集自定义类方法注释提示
一.为什么使用封装程序集: 在很多分布式应用程序开发中,针对每一种功能可能条用的接口不一样,往往习惯将需要被调用的接口,封装成DLL给调用方应用后使用,这样既规范了调用的方式,又避免了调用出现参数请求 ...
- 【linux草鞋应用编程系列】_2_ 环境变量和进程控制
一. 环境变量 应用程序在执行的时候,可能需要获取系统的环境变量,从而执行一些相应的操作. 在linux中有两种方法获取环境变量,分述如下. 1.通过main函数的参数获取环境变量 ...
- PHP运算符
运算符 PHP运算符可以根据操作数的个数分为一元运算符.二元运算符.三元运算符.一元运算符例如!(取反运算符)或++(加一运算符),PHP支持的大多数运算符都是这种二元运算符,例如+.-.*./等算数 ...
- 国内IT软件开发人员现状
首先在这里讨论的是国内的大陆地区.在今天这个中国IT环境下,开发人员出路何在?一个优秀开发人,应该有致力于编写优雅代码,让别人读得懂,具有可读性,可测试性的代码,不仅仅是可以运行的代 ...