当前位置:首页 > 单片机 > 单片机
[导读]伪指令注意:不同的IDE,伪指令也会有很大差别;但是汇编指令是一样的;伪操作标识符:功能:为汇编程序完成各种准备工作;特点:特殊的指令助记符但与指令系统的助记符不同,没有对应的源操作码;伪操作:伪操作符所

伪指令
注意:不同的IDE,伪指令也会有很大差别;但是汇编指令是一样的;
伪操作标识符:
功能:为汇编程序完成各种准备工作;
特点:特殊的指令助记符但与指令系统的助记符不同,没有对应的源操作码;

伪操作:伪操作符所完成的操作;
特点:只在汇编(编译)的时候伪操作发生作用,计算机运行的时候并没有位操作的参与,一旦汇编(编译)结束,伪操作的使命就完成了;

常用伪操作的分类

符号定义伪操作
功能:用来定义ARM汇编中的变量,对变量赋值以及定义寄存器的别名等操作。常用的有以下4种:
定义全局变量:GBLA,GBLL,GBLS
定义局部变量:LCLA,LCLL,LCLS
对变量赋值:SETA,SETL,SETS
为通用寄存器列表定义名称RLIST
数据定义伪指令
功能:为特定的数据分配存储单元,同时完成已分配存数单元的初始化
常用的有9中:
DCB:用于分配一片连续的字节存储单元并用指定的数据初始化;
DCW(DCWU):用于分配一片连续的半字存储单元并用指定的数据初始化;
DCD(DCDU):用于分配一片连续的字存储单元并用指定的数据初始化
DCFD(DCFDU):用于双精度浮点数分配一片连续的字存储单元并用于指定的数据初始化;
DCFS(DCFSU):用于分为单精度的浮点数分配一分连续的字存储单元并用指定的数据初始化
DCQ(DCQU):用于分配一片以8字节 为单元的连续的存储单元并用指定的数据初始化;
SPACE:分配一片连续的储存单元
MAP:定义一个结构化的内存表首地址;
FIELD:定义一个结构化的内存表的数据域;

汇编代码控制伪操作
功能:控制汇编程序执行流程。
常用的汇编控制伪指令如下:
1. IF,ELSE,ENDIF这三个符号连用,进行条件汇编
2. WHIL,WEND这两个符号连用,进行重复汇编
3. MACRO和MEND这两个符号连用,定义一个宏定义;
4. MEXIT用来在宏结束前退出宏定义。

信息报告伪指令
功能:用于程序汇编指示,主要是在程序调用阶段使用。
常用信息报告伪操作是:
ASSERT 程序错误报告伪操作
INFO 诊断信息报告伪操作
OPT 列表选项设置伪操作
TTL&SUBT 插入文件标题伪操作

指令集类型标识伪操作
功能:告诉编译器所要处理的是32位ARM指令还是16位Thumb
有两种:
ARM或CODE32指示编译器将要处理的是32位ARM指令
THUMB或CODE16只是将要处理的是16位的Thumb指令

其他伪操作指令
AREA:定义一段代码段或数据段
ALIGN:使程序当前位置满足一定的对齐方式
ENTR:指定程序入口
END:指定源程序结束
EQU:用于定义字符名称
EXPORT(或GLOBAL):用于声明符号可以被其他文件引用;
EXPORTAS:向目标文件引入符号
IMPORT:通知编一起当前符号不在本文件中
EXTERN:通知编一起要使用的符号在其他的源文件中定义,但要在当前源文件中引用
GET(INCLUDE):用于将一个文件包含到当前源文件中
INCBIN:将一个文件包含源文件中

常见伪指令的用法
这里谈到用法咱们用两种IDE来说:分别是linux环境下的GNU和ADS环境

定义常量或标号名称的伪操作
功能:类似于C语言中的宏定义#define
1)ADS环境下:
语法格式:标号名称 EQU/SETA expr(,type)
expr可以是32位整形变量,基于寄存器的地址值,程序相对的地址以及绝对地址。
栗子:USERMODE EQU 0x10
2)GNU环境
语法格式:.equ/.set 标号名称 ,
value同expr,表示数字常量或程序中的标号。例如:
.equ USERMODE ,0x10 //将符号常量0x10定义成USERMODE

段属性定义的伪操作
功能:定义一个代码段或数据段,或者开始一个新的代码段或数据段
1)ADS环境:
语法格式:AREA 段名 (,属性) (…,属性)…
栗子:
AREA M1, DATA , READONLY ;定义数据段
AREA M2,CODE , READONLY 定义程序段
数据段DATA,代码段CODE ,属性是READONLY(只读),数据段名是M1,代码段名是M2

2)GNU环境下
语法格式:.setion .段名 {,“标志”}
标志:各段有缺省标志,elf格式允许的标志段如下:
——————————————————
<标志> | 含义
A | 允许段
W | 可写段
X | 执行段
——————————————————
栗子:.setion .text, “x” ;表示定义了一个代码段是可执行的

这里要解释一下GNU环境下的定义段名的两种方法:
方法1:在GNU环境下,有些段名是汇编系统预定义的,例如.text为代码段,.data为初始化数据段,.bss为为初始化数据段等,每个段以段名开始,以下段名或者文件结尾为结束。
方法2:
例如:.setion .mysection ;自定义数据段,段名为.mysection

声明程序的入口点伪操作
功能:指定程序的入口;
1)ADS环境中
语法格式: ENTRY ……
2)GNU环境
语法格式:_start:

源程序结尾标识伪操作
功能:通知编译器,程序到此结束了;
1)ADS环境
语法格式:END
2)GNU环境
语法格式:.end ;常常省略不用

指令集类型标识伪操作
功能:告诉编译器所处理的是32位的ARM指令还是16位的Thumb指令
1)ADS环境
语法格式:
ARM(CODE32)
……
THUMB(CODE16)
……
2)GNU环境下
语法格式:
.arm或.code: .code32 ……
.thumb或.code: .code16 ……

对齐方式设置伪操作
功能:通过填充字节,使当前位置满足一定的对齐方式
1)ADS环境
语法格式:ALIGN {对齐表达式{,偏移量{,填充的字节}}}
对齐表达式:指定对齐方式
偏移量:是一个数字表达式,若使用该字段,则当前位置的对齐方式为n*expr+偏移量。
栗子
aa DCB 0x58 ;定义一字节名为aa的储存空间,字对齐方式被破坏
ALIGN ;声明字对齐
2)GNU环境
.align/.balign {对齐表达式}{,填充的数据}
对齐表达式用于对齐方式,取指为0~15之间;

声明全局标号伪操作
在ARM和C语言混合编程中,经常用到全局标号声明,例如下面的代码:
EXPORT FUNCNAME
……
FUNCANME
……
声明全局变量标号用于在程序声明中声明一个全局变量,该标号可以在其他文件中被引用,类似于C语言中的全局变量
1)ADS环境下
语法格式:EXPORT / GLOBAL{符号} {[WEAK],[attr]}
[WEAK]选项声明其他的同名标号优先于该标号被引用
[attr]符号属性用于定义所定义的符号对其他文件的可见性(visibility),attr可以是下面一些属性值:
DYNAMIC符号可以被其他文件引用,并且可以在其他文件中被重新定义。
PROTECTED符号可以被其他文件引用,但是可以重新定义;
HIDDEN符号不能被其他文件引用;
2)GNU中的用法
语法格式:.global / .globl 符号 ;符号是要声明的全局变量名称
举个栗子:
.globel _start ;声明全局变量_start

声明外部全局变量伪指令
功能:通知编译器要使用的标号在其他源文件中定义,但要在当前源文件中被引用,标号在程序中区分大小写。
1)ADS环境
语法格式:IMPORT/EXTEREN {符号} {[WEAK],[attr]}

[WEAK]选项表示当前所有源文件都没定义这个符号,编译器也不给出错误信息。在多数情况下将该标号置0,若该标号被B或者BL指令引用,则将B或BL指令置为NOP操作;
[attr]符号属性用于定义所定义的符号对其它文件的可见性(visibility),用法同EXPORT中的attr

比较EXTERN和IMPORT的区别:
1,IMPORT声明的符号无论当前源文件是否引用该标号,该标号均会被加入当前源文件的符号表中;
2.EXPORT声明的符号,如果当前源文件实际未引用该标号,则该标号不会被加入到当前源文件中的符号列表;

2)GNU环境
语法格式:.extern 符号 @符号是要声明的外部变量名称

声明数据缓冲池伪操作
功能:哎呀,其实就是要声明数组;
使用LDR伪指令时,要在适当的位置声明数据缓冲池,这样会把要加载的数据保存到缓冲池中,再寄存使用ARM加载指令读出。数据缓冲池类似于C中的数组,如果没有使用声明数据缓冲池的伪操作,则汇编器会在程序末尾自动声明;
……
LTORG
src
DCD 1,2,3,4,5,6,7,8,1,2,3,4,5;字数据
dst
DCD 0,0,0,0,0,0,0,0,0,0;
1)ADS环境
语法格式:LTORG

2)GNU环境
语法格式: .ltorg
.ltorg 在当前段的当前地址产生一个文字池

LDR R0 , =src
……
.ltorg @定义数据缓冲池,存放在src开始的地址处
src:
.LONG 1,2,3,4,5,6,7,8,9
dst:
.LONG 0,0,0,0,0,0,0,0,0

数据定义伪操作
功能:为特定的数据分配存储单元,也可以完成已分配储存单元的初始化

数据定义的数据类型:
DCB(分配字节存储单元)-128~255之间的数字或字符串,
DCW/DCWU(分配半字存储单元)-32768~65535间的数字表达式
DCD/DCDU (分配字存储单元)是表达式
DCFS(单精度浮点数)
DCFD(双精度浮点数)
DCQ(双字)

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭