ARM汇编--汇编中符号和变量
习惯了使用C语言的情况下我发现自己对与汇编程序的符号和变量的理解很不深刻,今天抽空来学学加深理解。以ARM汇编来说,在汇编代码中所有以"."开头的指令都是汇编伪指令,他们不属于ARM指令集。常常在汇编代码中看到如下的使用方式但很少深入理解这样的写法的深层实现意义。究竟这两种使用方式区别是什么呢?
.global xxxx
.word xxxx
查阅GNU的汇编伪指令说明后按我理解的我将两者按如下的方式解释:
.global
修饰标号为全局的,用法 .global xxx 这个符号可以被当前源文件以外的其他文件使用也可以被连接脚本(连接器)使用,xxx仅仅是一个标号对应一个地址并不是C中的一个变量。
无法对他取地址,因为他本身代表一个地址,仅仅是一个对应到一个编译过程中的值的别名,类似C代码中的define 定义的一样,只是在链接时他的值是由连接器自动处理的。
汇编代码使用仅能使用ldr,Rx,=xxx;而不能使用ldr,Rx,xxx
.word
汇编一个字的内存块,用法 .word expressions 这个expressions 可以是一个数也可以是一个符号或表达式。 如果是一个数则这里直接放置的就是这个值。如果是一个标号则
这个标号最后值就会存放这里,标号的值就是这块内存的地址。可以在C语言中直接使用extern uint32_t expressions来读写这个变量。
汇编中的使用同.global。expressions还可以是连接脚本中定义的符号。
这里 和word相同的功能的伪指令还有
.byte ;定义单字节数据
.hword/.short ;定义双字节数据
.word/.long /.int ;定义4字节数据
.quad ;定义8字节数据
.float/.single ;定义32bit 浮点数
.double ;定义64bit浮点数
.ascii ;定义字符串以/0为结束符
例: .ascii "hello\0"
.asciz /.string ;定义字符串(非零结束符)
例: .string "hello"
.fill ;分配一段字节内存单元,用size长度value填充repeat次
例: .fill 10,2,6 ;将两个字节长度的6重复填充10次
.zero ;分配一段字节内存单元,并用0填充内存
例: .zero 10 ;分配十个字节单元,并用0填充
.space/.skip ;分配一段内存单元,用value将内存单元初始化
例: .space 10,6 ;分配十个字节单元,并用6填充
实例代码(来自liteos):
/* 修饰标号 __LOS_HEAP_ADDR_START__ 下同 */
.global __LOS_HEAP_ADDR_START__
.global __LOS_HEAP_ADDR_END__
/* 定义标号 __LOS_HEAP_ADDR_START__ 下同 */
__LOS_HEAP_ADDR_START__:
.word __los_heap_addr_start__
__LOS_HEAP_ADDR_END__:
.word __los_heap_addr_end__
符号(或标号)
仅存在程序构建过程而不存在于最终目标文件中,常常配合编译和链接脚本使用,其保存的是地址信息。
变量
最终会在运行RAM中找到,如果是全局的就会一直存在。符号或标号指向一个地址,如下就是定义变量(连接器会预留这块内存),__los_heap_addr_start__指向一块内存,他的意思更像C语言中的变量实际对应特定地址的内存。
顺带查到的伪指令记一下:
.syntax
ARM架构下使用的定义汇编语法格式伪指令,用法 .syntax [unified | divided],其中divided为缺省值。 divided 此时使用旧的汇编风格,此时ARM和THUMB指令有着各自的语法。 使用unified时,ARM和THUMB指令使用统一的语法,有着以下的主要特性:
立即数不需要#前缀 可能会出现IT指令,如果出现,则根据后面的条件码进行验证。
在ARM模式下,它不会生成机器码,而在THUMB模式下则会生成机器码
对于ARM指令,条件码总是出现在指令的最后;对于THUMB指令,条件码可以被使用,但仅限于IT指令的范围内 V6T2架构(及更高版本)的所有新指令都可用(这些指令中,divided语法仅支持少部分) 支持.N和.W后缀
.thumb 指定使用thumb指令集
.cpu 指定cpu类型如cortex-m0
.fpu 指点浮点计算指令的类型,有soft,softfp,hard 具体参考编译器的帮助文档一般在编译器路径的/share下有编译器的帮助文档。
.arch 指定代码目标架构,如armv7-a
.type 指定符号类型
参考源码地址:https://gitee.com/LiteOS/LiteOS/blob/master/targets/Cloud_STM32F429IGTx_FIRE/los_startup_gcc.S
参考博客:https://blog.csdn.net/gameit/article/details/13169307
ARM汇编--汇编中符号和变量的更多相关文章
- ARM嵌入式开发中的GCC内联汇编__asm__
在针对ARM体系结构的编程中,一般很难直接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为了唯一的选择.但如果完全通过汇编代码实现,又会过于复杂.难以调试.因此,C语言内嵌汇编的方式 ...
- 从汇编看c++中指向成员变量的指针(二)
在从汇编看c++中指向成员变量的指针(一)中讨论的情形没有虚拟继承,下面来看看,当加入了虚拟继承的时候,指向成员变量的指针有什么变化. 下面是c++源码: #include <iostream& ...
- 在汇编代码中调用C函数
对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard),ATPCS主要是定义了函数呼叫时参数 ...
- ARM标准汇编与GNU汇编
ARM标准汇编与GNU汇编 http://www.cnblogs.com/hnrainll/archive/2011/05/17/2048315.html
- ARM常用汇编指令介绍
b 跳转指令(跳转范围为32Mb) bl 带返回地址的跳转,指令自动将下一条指令的地址复制到R14寄存器,然后跳转到指定地址去执行,执行完后返回到下一条指令处执行 pc 寄存器R1 ...
- vs中调试程序查看变量在内存中的内容的方法
vs中调试程序 查看变量在内存中的内容的方法 https://blog.csdn.net/guojg1988/article/details/42922149 原文链接:http://www.sows ...
- [.net 面向对象编程基础] (5) 基础中的基础——变量和常量
[.net面向对象编程基础] (5) 基础中的基础——变量和常量 1.常量:在编译时其值能够确定,并且程序运行过程中值不发生变化的量. 通俗来说,就是定义一个不能改变值的量.既然不能变动值,那就必须 ...
- javascript 中$符号是代表什么意思!
$符号在php中是表示变量的特征字符, 在js中它也有很多作用, 一般我们用来命名一个函数名称,获取id的 1. 首先可以用来表示变量, 比如变量 var s='asdsd'或var $s='asda ...
- jQuery中 $ 符号的冲突问题
jQuery中 $ 符号的冲突问题是常见问题之一. 在jQuery中,$是jQuery的别名,为了书写方便,我们更习惯用$('#id')这一类的方式来书写代码.当同一页面引用了jQuery多个版本 ...
随机推荐
- JVM虚拟机基础
JVM 全称Java Virtual Machine,也就是我们耳熟能详的Java 虚拟机.它能识别.class 后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作. Ja ...
- Http中的options请求
引自:https://www.jianshu.com/p/5cf82f092201.https://www.cnblogs.com/mamimi/p/10602722.html 一.options是什 ...
- 在nodejs中创建child process
目录 简介 child process 异步创建进程 同步创建进程 在nodejs中创建child process 简介 nodejs的main event loop是单线程的,nodejs本身也维护 ...
- Vue之创建组件之配置路由!
Vue之创建组件之配置路由!== 第一步: 当然就是在我们的试图文件夹[views]新建一个文件夹比如home 在home文件夹下面新建一个文件index.vue 第二步:在router目录下做如下事 ...
- (16)-Python3之--集合(set)操作
1.定义 集合的关键字:set 集合主要作用: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 集合用大括号{}表示,元素间用逗号分隔. 建立集合类型用{} ...
- jQuery 移入显示div,移出当前div,移入到另一个div还是显示。
jQuery 移入移出 操作div 1 <style type="text/css"> 2 .box{ 3 position: relative; 4 } 5 .box ...
- PE节表
- Jenkins部署springboot项目
记录jenkins如何部署springboot项目(jar类型的) 一.首先需要先配置好jenkins的基本配置(jdk.maven--),可在系统管理-->>全局工具配置中进行配置. 配 ...
- 倍增小结 ST 与 LCA
倍增 倍增我是真滴不会 倍增法(英语:binary lifting),顾名思义就是翻倍. 能够使线性的处理转化为对数级的处理,大大地优化时间复杂度. (ps:上次学倍增LCA,没学会,老老实实为了严格 ...
- 【ElasticSearch】 使用AWS云ES服务来分析程序日志
最近公司系统升级,有些API的调用接口达到了每天10几万的请求量.目前公司里的日志,都是写文本文件中的.为了能够更好的分析这些日志数据,公司采用了AWS 的 ElasticSearch服务来分析日志. ...