习惯了使用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汇编--汇编中符号和变量的更多相关文章

  1. ARM嵌入式开发中的GCC内联汇编__asm__

    在针对ARM体系结构的编程中,一般很难直接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为了唯一的选择.但如果完全通过汇编代码实现,又会过于复杂.难以调试.因此,C语言内嵌汇编的方式 ...

  2. 从汇编看c++中指向成员变量的指针(二)

    在从汇编看c++中指向成员变量的指针(一)中讨论的情形没有虚拟继承,下面来看看,当加入了虚拟继承的时候,指向成员变量的指针有什么变化. 下面是c++源码: #include <iostream& ...

  3. 在汇编代码中调用C函数

    对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard),ATPCS主要是定义了函数呼叫时参数 ...

  4. ARM标准汇编与GNU汇编

    ARM标准汇编与GNU汇编 http://www.cnblogs.com/hnrainll/archive/2011/05/17/2048315.html

  5. ARM常用汇编指令介绍

    b     跳转指令(跳转范围为32Mb) bl    带返回地址的跳转,指令自动将下一条指令的地址复制到R14寄存器,然后跳转到指定地址去执行,执行完后返回到下一条指令处执行 pc    寄存器R1 ...

  6. vs中调试程序查看变量在内存中的内容的方法

    vs中调试程序 查看变量在内存中的内容的方法 https://blog.csdn.net/guojg1988/article/details/42922149 原文链接:http://www.sows ...

  7. [.net 面向对象编程基础] (5) 基础中的基础——变量和常量

    [.net面向对象编程基础]  (5) 基础中的基础——变量和常量 1.常量:在编译时其值能够确定,并且程序运行过程中值不发生变化的量. 通俗来说,就是定义一个不能改变值的量.既然不能变动值,那就必须 ...

  8. javascript 中$符号是代表什么意思!

    $符号在php中是表示变量的特征字符, 在js中它也有很多作用, 一般我们用来命名一个函数名称,获取id的 1. 首先可以用来表示变量, 比如变量 var s='asdsd'或var $s='asda ...

  9. jQuery中 $ 符号的冲突问题

    jQuery中 $ 符号的冲突问题是常见问题之一.   在jQuery中,$是jQuery的别名,为了书写方便,我们更习惯用$('#id')这一类的方式来书写代码.当同一页面引用了jQuery多个版本 ...

随机推荐

  1. 解决安装mysql动态库libstdc++.so.6、libc.so.6版本过低问题

    初始化mysql报错: ./bin/mysqld: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ...

  2. 目标检测的评价指标(TP、TN、FP、FN、Precision、Recall、IoU、mIoU、AP、mAP)

    1. TP TN FP FN ​ GroundTruth 预测结果 TP(True Positives): 真的正样本 = [正样本 被正确分为 正样本] TN(True Negatives): 真的 ...

  3. C指针的这些使用技巧,掌握后立刻提升一个Level

    这是道哥的第016篇原创 关注+星标公众号,不错过最新文章 目录 一.前言 二.八个示例 1. 开胃菜:修改主调函数中的数据 2. 在被调用函数中,分配系统资源 2.1 错误用法 2.2 正确用法 3 ...

  4. VMwareWorkstation 平台 Ubuntu14 下安装配置 伪分布式 hadoop

    VMwareWorkstation平台Ubuntu14下安装配置伪分布式hadoop 安装VmwareStation 内含注册机. 链接:https://pan.baidu.com/s/1j-vKgD ...

  5. https://github.com/golang/crypto/blob/master/bcrypt/bcrypt.go

    https://github.com/golang/crypto/blob/master/bcrypt/bcrypt.go

  6. 深入TLS/SSL协议

    总体 TLS/SSL协议是为了解决网络通讯中的信息安全问题而诞生的. 它的设计目的主要有三个: 身份验证--搞清楚与我通讯的人是不是我所想的那个. 保密性--就算第三方拿到了通讯内容,也搞不清楚其中所 ...

  7. 网络流 - dinic + 当前弧优化【代码】

    这是初学网络流的时候从<算法竞赛进阶指南>抄下来的一份代码,自己理解的也不是很透彻. 注意,边要从 \(1\) 开始计,不然直接 \(xor\) 运算的话取反边会直接炸掉. #includ ...

  8. 题解 P3833 【[SHOI2012]魔法树】

    题目 直通车 很显然这是个树刨的板子,树上链查询和子树查询 注意: 1.这个点的树根为 0 而不是 1 所以注意读图时点标号 +1 就解决了 2.注意数据范围\(2^{32}\) 然后板子就能过了 n ...

  9. Spark 应用监控告警-Graphite_exporter

    Spark 应用监控告警-Graphite_exporter Spark监控和工具 Web界面 事后查看 REST API 度量 高级工具 一.下载graphite_exporter 1.1 修改gr ...

  10. 烧录失败导致boot无法加载的解决措施,再也不怕烧成砖了

    目录: 1.usb烧录时出现的问题截图 2.重新擦除boot发现失败的情况 3.解决措施 烧录失败导致boot无法加载的解决措施在烧录系统的时候经常会遇到烧录失败的情况,如果能通过再次执行烧录能烧上肯 ...