由于C的普及以及编译器的发展,越来越多的软件工程师在编程时很少有机会接触到汇编语言。在ARM的开发中,我们不可避免的会遇到启动文件的编写,在KEIL环境中一般采用了startup.s的文件作为启动代码,很多工程师一见到这个文件就很头痛,这里我简单地介绍一些常见的汇编指令、伪指令,希望对大家有所帮助,下次见到.s文件时也不会觉得那么难以接受。

提醒下大家,在汇编代码中是不区分大小写的,这点和C语言不太一样,所以一下的指令在很多时候是用小写的。不过我个人意见是汇编最好全部用大写字母,这样方便阅读。

本笔记有很多是基础的知识,适合一些初级的工程师学习。很多指令和语法是汇编通用的,如果你耐心的全部看完,相信一定对你的开发工作有帮助。

1.   REQUIRE8和PRESERVE8

在定义堆栈的时候,我们经常会看到REQUIRE8和PRESERVE8伪指令,这两个指令是告诉编译器保证8字节对齐。因为ARM的编译器默认是4字节对齐的,而在堆栈的操作中很多时候我们会用到LDRD和STRD这样的双字传送指令,所以这里的存储器就要求要8字节对齐。

实际操作中,REQUIRE8和PRESERVE8并不会直接完成对齐的操作,而只是更改编译器中的编译属性,真正的对齐操作是由ALIGN来完成的。

2.   AREA

AREA 伪指令用来定义一个存储器的区域,一般我们把它叫做段(sector).其语法格式如下:

AREA 段名称 属性1,属性2, ……

需要注意的是如果段名称是由数字或者特殊字符开头,则需要用||把段名称括起来。例如 |3_Code| 或者|.code|

属性部分用来表示该存储器段的相关属性,多个属性之间用逗号隔开,常用的属性如下:

- NOINIT : 非初始化

- CODE   :用于定义代码段,定义了该属性则默认READONLY属性

- DATA   : 用于定义数据段,定义了该属性则默认READWRITE属性

- READWRITE/READONLY : 用来标示本段是只读还是可读可写

- ALIGN  : 存储器的访问的对齐, 一般定义为ALIGN = N,其中N表示对齐的字数,例如:

ALIGN = 2表示对齐方式是2的2次方,即4字节对齐

ALIGN = 3 标示对齐方式是2的3次方, 即8字节对齐

- COMMON : 该属性用来定义一个通用的存储区,不包含任何代码和数据。在不同源文件中定义的COMMON区域共享一个存储区域。

3.   THUMB(CODE16)、ARM(CODE32)

这两个伪指令通知编译器,其后的指令为16位的Thumb指令还是32位的ARM指令。由于ARM7的内核支持这两种指令模式,而且允许在同一个代码中,对这两个模式进行切换,所以在使用ARM和Thumb指令混合编程的代码中,用这两条伪指令来切换。

在Cortex-M系列内核中,由于采用了Thumb2的指令集,所以不存在切换ARM的指令模式。

 4.   EXPORT,IMPORT,EXTERN

这两个伪指令用来声明或引用一个全局的变量(函数)标号。在汇编和C的混合编程代码中,可以通过这两个伪指令来传递变量(函数)标号。其中EXPORT也可以用GLOBAL代替。

需要注意的是虽然汇编语言不区分大小写,但变量(函数)的标号是区分大小写的。

IMPORT的用法和EXTERN类似。它们主要的区别在于如果外部文件未定义本标号,是否添加到本源文件的符号表中,对一般的程序员来讲不用关心这个差别。

如果在EXPORT和IMPORT 后面有[WEAK]的参数,表明本指令声明的标号如果在其他地方遇到同名的标号,本标号的优先级最低。

5.   SPACE

SPACE用来保留一个指定大小的存储空间。该语句比较简单,例如:

SPACE 100

表示在本指令开始的地址划分出一个100字节大小的空间。

6.   SPACE

SPACE用来保留一个指定大小的存储空间。该语句比较简单,例如:

SPACE 100

表示在本指令开始的地址划分出一个100字节大小的空间

7.   ENTRY

ENTRY用于指定汇编程序的入口点,有点像C语言中的main函数。一个完整的汇编应用程序至少需要一个ENTRY。

8.   INCBIN

有时候我们会遇到这样的问题,我有一个图片或数据编译成了BIN文件,这样我如何把它嵌入到我的程序中来呢? INCBIN这个伪指令就给我们带来这样的用处,它可以把一段已经编译好的BIN文件包含到当前的源文件中,被包含的文件不做任何改动。

例如:

我们要把一个编译好的字符串加入源文件来,我们可以这样写:

EXPORT string_1 ; 声明这个字符串的标号,方便其他程序调用

String_1

INCBIN string_1.bin   ; 载入该字符的bin文件

在*.c的文件中,我们可以直接调用String_1[]这个数组。

9.   GET, INCLUDE

GET和INCLUDE类似,它们用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。这个和C语言中的”#include”类似

10.  END

END伪指令用来通知编译器到了源程序的结尾。他和ENTRY相对应,一个应用程序只应该有一个END。

以上内容摘自Triton.Zhang。

stm32 开发中startup.s文件中常见的命令功能的更多相关文章

  1. VS开发】C中调用C++文件中定义的function函数

    [VS开发]C中调用C++文件中定义的function函数 标签(空格分隔): [VS开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 精要一揽 C调用 ...

  2. CUDA常见问题之无法在c文件中调用cu文件中定义的函数

    当在C源文件中调用cu文件中定义的函数时,会出现undefined reference的问题,而在C++源文件中调用cu文件中定义的函数时则不会出现这个问题. 出现上述问题的原因是,nvcc编译器采用 ...

  3. 【集中工作薄】 当前文件夹中所有Excel文件中 多个工作簿的第一个工作表 复制到工作簿中

    功能:当前文件夹中所有Excel文件中 多个工作簿的第一个工作表 复制到工作簿中 Sub Books2Sheets() '定义对话框变量 Dim fd As FileDialog Set fd = A ...

  4. ansys中的.full文件中如何看刚度矩阵和质量矩阵(转)

    http://fffff-2001.blog.163.com/blog/static/15507529200722492917460 Q:请问ansys中的.full文件中如何看刚度矩阵和质量矩阵? ...

  5. Vscode中解决Html文件中不能打断点问题

    Vscode中解决Html文件中不能打断点问题: 默认情况下,VSCode是不能在Html文件里打断点的,但是可以修改设置,依次打开:文件->首选项->设置,然后功能->调试-> ...

  6. make: g77: Command not found 修改Makefile.in中的编译文件中的g77为gfortran

    make: g77: Command not found 编译cblas时报错,这时,修改Makefile.in中的编译文件中的g77为gfortran

  7. 2. 假设当前文件夹中data.csv文件中存放了2020年某饭店营业额,第一列为日期(如2020-02-03),第二列为每天交易额(如3560),文件中第一行为表头,其余行为实 际数据。

    假设当前文件夹中data.csv文件中存放了2020年某饭店营业额,第一列为日期(如2020-02-03),第二列为每天交易额(如3560),文件中第一行为表头,其余行为实  际数据.编写程序,完成下 ...

  8. iOS中Info.plist文件的常见配置

    . 在创建一个新的Xcode工程后,会 在Supporting Files文件夹下自动生成一个工程名-Info.plist的文件,这个是对工程做一些运行期配置的文件(很重要,必须有该文件). 如果使用 ...

  9. 如何在 asp.net core 3.x 的 startup.cs 文件中获取注入的服务

    一.前言 从 18 年开始接触 .NET Core 开始,在私底下.工作中也开始慢慢从传统的 mvc 前后端一把梭,开始转向 web api + vue,之前自己有个半成品的 asp.net core ...

随机推荐

  1. 对象 Object

    在js 中创建最简单的对象,然后给它添加属性或者方法 示例如下: var obj = new Object(); //或者 var obj = {}; obj.name = '张三'; obj.fun ...

  2. 爬虫--requests模块高级(代理和cookie操作)

    代理和cookie操作 一.基于requests模块的cookie操作 引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests ...

  3. jquery接触初级----jquery 选择器

    css 选择器主要有:元素选择器,ID选择器,类选择器,群组选择器,后代选择器,普通配符选择器等,通过css选择,我们可以很方便的给元素添加样式,使网页看起来更加好看 jquery 选择器也有相似的功 ...

  4. docker之数据卷管理

    转自:https://www.cnblogs.com/jsonhc/p/7777811.html docker之数据卷的备份和还原 1.现在利用镜像创建一个nginx的服务容器,并挂载一个数据卷 [r ...

  5. sql server 2008 数据库可疑的解决步骤

    备份并新建同名数据库,并替换原数据文件 1 把问题数据库备份后直接删除 停掉SQLSERVER服务,把服务器上出问题的数据库, 假设名称为 test的数据库文件及日志文件备份到其他目录,然后直接将其删 ...

  6. 将应用部署到Tomcat根目录下

    方法一:(最简单直接的方法) 删除原 webapps/ROOT 目录下的所有文件,将应用下的所有文件和文件夹复制到ROOT文件夹下. 方法二: 删除原webapps/ROOT 目录下的所有文件,修改文 ...

  7. 新版openvpn for pc使用旧证书问题的处理

    在client.ovpn中增加一句: tls-cipher "DEFAULT:@SECLEVEL=0"

  8. 25. IO流.md

    目录 IO分类: 1.FIle类 1.1目录分隔符 1.2常用方法 2.FileInputStream类 2.1读取文件 3.FileOutputStream类 拷贝文件 4.缓冲流 4.1 Buff ...

  9. ArcGIS案例学习笔记-栅格数据分区统计(平均高程,污染浓度,污染总量,降水量)

    ArcGIS案例学习笔记-栅格数据分区统计(平均高程,污染浓度,污染总量,降水量) 联系方式:谢老师,135-4855-4328,xiexiaokui@qq.com 目的:针对栅格数据,利用多边形面要 ...

  10. 学习shell脚本之前的基础知识(一)(学习记录帖)

    记录命令历史:我们敲过的命令,linux会有记录,保存在家目录的.bash_history文件中.(备注:只有用户正常退出当前shell时,当前命令才会保存在.bash_history文件中) “  ...