历史上的今天
返回首页

历史上的今天

今天是:2025年04月01日(星期二)

正在发生

2019年04月01日 | STM32 启动代码汇编指令详解

2019-04-01 来源:eefocus

● EQU 


伪指令EQU用来为一个数字常量或一个和内核寄存器相关的数值或一个和程序计数器相关的数值定义的一个符号名称,类似于C语言中的"#define"。


语法格式:name EQU expr{ , type} 


注意:语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的; 


name:数值(expr)的符号名称;


expr:一个与内核寄存器相关的地址,或一个绝对地址,或一个与PC相关的地址,或一个32位整型常量;

 

type:可选项,它可以是ARM、THUMB、CODE16、CODE32或DATA中的任何一个。 


举个例子:


fiq EQU 0x1C,CODE32


● AREA

 

伪指令AREA用来定义一个代码段或数据段(data section),到底是数据段还是代码段可以从属性名词分辨出。 


语法格式:


AREA sectionname{,attr}…{,attr}… 


注意:


语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的。 


sectionname:


代码段或数据段的名称。惯用|.text|,它被用于由C编译器产生的代码段或和C库相关的代码段。 


它是一块独立的不可分割的数据段或代码段,可以为任何名称。


不过,非字符起始的必须加下划线,如1_dataarea。 


attr:由一个或多个被逗号隔开的节(或段)属性组成。 


段属性有:ALIGN=expression,表示这个数据或代码段按2^expression个字节对齐; 


NOINIT表示不零初始化; 


READWRITE表示可读可写; 


DATA表示只对数据段进行操作,默认可读可写。 


注意:


伪指令DATA已经被编译器忽略了,不过它可以作为属性使用。 


此外还有其他的属性,这里就不过多介绍了,详见《汇编器用户指南》。


● SPACE 


伪指令SPACE用于在存储器中开辟一段连续的存储空间,并初始化为零。 


语法格式:{label} SPACE expr 


注意:


语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的。 


label:它是可选的。


它可以是任何不与编译器冲突的字符名称,可以被用来说明开辟的内存空间的名称或作用。 


expr:


开辟的零初始化存储空间的大小,即字节数。也可是某一个有确定数值的字符。 

举个例子:若Stack_Size=0x40,那么语句 Stack_Mem SPACE Stack_Size是正确的。


● PRESERVE8 


伪指令PRESERVE8指定当前的文件中,堆栈区的对齐方式为8字节对齐。 


语法格式:PRESERVE8 {bool} 


注意:


语法格式中{ }不属于语法格式的部分,并且{ }中的内容是可选的。 

bool:它是可选的。


它不是 true 就是 false,默认为true。


● THUMB 


伪指令THUMB命令汇编器以UAL语法将THUMB后面的指令翻译成T32指令。 


语法格式:


THUMB


● EXPORT 


伪指令EXPORT用于在程序中声明一个全局的标号,该标号可在其他的文件中被引用。 


语法格式:


EXPORT的语法格式共有5种,下面主要介绍下启动代码中用到的3种。

 

1)EXPORT { [WEAK]} 


2)EXPORT symbol { [SIZE=n]} 


3)EXPORT symbol [ WEAK {,attr}{type{,set}}{,SIZE=n}] 


注意:


语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的。 


[WEAK]:


表示其他的同名标号优先于该标号被引用。如果省略symbol,那么所有的标号都是“WEAK”。 


从启动代码中可以发现,中断服务函数是弱声明的(由[WEAK]关键字标注)。


弱声明:


如果用户定义了相同的函数则启动代码中的该函数失效而使用用户定义的中断服务函数。


这样是为了防止用户使能了中断而没有中断服务函数,从而造成程序崩溃。


假设使能了中断,而用户又没有定义这个中断服务函数则会进入默认中断,默认中断为死循环。 


symbol:


它是全局属性标号,区分大小写,如果省略symbol,那么所有标号都是全局的。


● IMPORT 


IMPORT 伪指令用于通知编译器要使用的标号在其他的源文件中被定义(即在外部文件中被定义,相当于C语言中的extern),但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的标号表中。


该标号在程序中区分大小写。 


语法格式: 


1)IMPORT symbol { [type]} 

2)IMPORT symbol { [SIZE=n]} 

3)IMPORT symbol [WEAK{,attr}…{,type}…{,SIZE=n}] 


[WEAK]:


[WEAK]选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0。


若该标号被B或BL指令引用,则将B或BL指令置为NOP操作。 


symbol:


它分别在汇编源文件、目标文件或库文件中,区分大小写。


● DCD 


伪指令 DCD 用于分配一片连续的字存储单元并用指定的数据初始化。


用 DCD 分配的字存储单元是字对齐的。 


语法格式:


{label} DCD {U} expr {,expr} 


expr:


它是程序表达式或数字表达式


● IF ELSE ENDIF 


伪指令 IF,ELSE,ENDIF 用来允许有条件的汇编指令或伪指令。 


语法格式: 


IF logic-expression 

 指令序列1 

ELSE 

 指令序列2 

ENDIF 


说明:


IF,ELSE,ENDIF 伪指令能根据条件的成立与否决定是否执行某个指令序列。


当IF后面的逻辑表达式为真,则执行指令序列1,否则执行指令序列2。


其中,ELSE及指令序列2可以没有,此时,当IF后面的逻辑表达式为真,则执行指令序列1,否则继续执行后面的指令。 


此外,伪指令IF,ELSE,ENDIF可以嵌套使用。 


逻辑表达式 logic-expression 也可以为单目运算。


如单目操作数 :DEF: ,:DEF:A则表示如果A被定义,则为真,否则为假。


● PROC 


伪指令 PROC 标志着程序的开始。


● ENDP 


伪指令 ENDP 标志着程序(调用)的结束。


● END 


伪指令 END 告诉汇编器已经到源程序文件的末尾。

 

● B 


指令 B 是跳转指令。 


语法格式:


B label 


在启动代码中,会发现 label 是一个点“.”,它表示跳转到当前的指令地址处(即当前的 PC 值),也就是进入到当前的死循环中了。


● BX 


指令 BX 是跳转指令。 


语法格式:


BX Rm 


其中,Rm 是一个内核寄存器,它的值是一个地址值。


上述指令表示程序跳转到 Rm 所指向的指令处。


● LDR 


LDR 既可以作为加载指令使用,也可以作为伪指令。 


作为伪指令时的语法格式:


LDR Rt, =expr


其作用是将 expr 的值(expr为立即数)或 expr 的地址(expr是一个标号)加载到 Rt 中。 


作为加载指令时的语法格式:


LDR {type}{cond} Rt, [Rn {, #offset}]


其作用是将 Rn(Rn的值是一个地址值)中的数值加载给 Rt。


● ORR 


指令 ORR 是逻辑或操作指令。 


语法格式:


ORR {S} {cond} Rd, Rn, operand2 


其中,Rn 是第一操作数,operand2 是第二操作数。


上述指令表示将 Rn 和 operand2 进行逻辑或操作,其结果保存到目标操作数 Rd 中。


● STR 


STR 是一个典型的存储指令。 


语法格式:


STR {type}{cond} Rt, [Rn {, #offset}]。


该指令表示将寄存器 Rt 中的字数据存放到以 Rn{+offset} 为地址的寄存器中。 


注意:


语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的。


推荐阅读

史海拾趣

Decawave公司的发展小趣事

随着UWB技术的不断发展和应用领域的不断扩展,Decawave不断丰富和完善其产品和解决方案。除了UWB芯片外,公司还推出了与UWB芯片兼容的模块和开发工具,以及针对特定应用场景的解决方案。这些产品和解决方案不仅满足了客户的不同需求,也进一步巩固了Decawave在UWB技术领域的领先地位。

Excelics [Excelics Semiconductor, Inc.]公司的发展小趣事

在半导体行业,产品质量是企业生存和发展的关键。Excelics Semiconductor始终将品质管理放在首位,建立了严格的质量控制体系。他们通过引进先进的生产设备和技术,确保每一片芯片都符合高标准的质量要求。这种对品质的执着追求赢得了客户的信任和市场的认可。

EA Elektro-Automatik公司的发展小趣事

1974年,电子工程师Helmut Nolden先生在德国创立了EA Elektro-Automatik公司。初期,公司主要生产小型固定式和可调式电源,以满足工业、实验室和业余爱好者的需求。这些产品凭借稳定的性能和合理的价格,在市场上逐渐获得了认可。随着技术团队能力的逐渐提高和持续创新,EA Elektro-Automatik开始扩大产品线,满足更多客户的特定需求。

EDDING公司的发展小趣事

在成功占领国内市场后,ECLIPSE公司开始积极拓展国际市场。通过与国际知名企业和机构的合作,Eclipse得以在全球范围内推广和应用。同时,公司还积极探索多元化发展道路,将Eclipse的技术和模式应用于其他领域和行业。这些努力不仅为ECLIPSE公司带来了更多的商业机会和市场份额,也为其在电子行业的长远发展奠定了坚实的基础。

以上五个故事是基于Eclipse项目的发展历史和电子行业的一般趋势而虚构的。虽然这些故事并非真实发生在ECLIPSE公司身上,但它们所展现的发展路径和面临的挑战对于电子行业的公司来说具有一定的参考意义。

CDI-DIODE公司的发展小趣事

随着市场需求的不断增长,CDI-DIODE公司意识到单凭自身力量难以满足所有客户的需求。于是,公司积极寻求与其他企业的合作,通过共同研发、生产和销售,实现了业务的快速拓展。这种合作模式不仅提升了公司的产能和效率,也加强了与合作伙伴之间的紧密联系。

Curtis Instruments Inc公司的发展小趣事

1995年,Curtis在中国建立了独资企业科蒂斯仪器(中国)有限公司,其制造工厂于1997年投入生产。经过近20年的发展,Curtis在中国已经建立了完善的生产、研发和销售体系。2012年,Curtis在苏州工业园区成立了独立的科蒂斯技术(苏州)有限公司,进一步提升了在中国的研发和生产能力。如今,Curtis中国已成为Curtis在全球的第6个研发中心,也是中国最现代化的生产电动车辆驱动控制系统的厂商之一。

问答坊 | AI 解惑

求助:使用multisim 10仿真遇到的问题

请问,用这个软件仿真时,我要用到多路转换MAX4310 和计数器4060 ,但元件库里没有,是否可以用其他的元件替代? 请问可以用什么元件替代啊?…

查看全部问答>

成都海容嵌入式学院的学员请进~~~

各位有去过成都海容嵌入式学院培训过的吗?我说的那个就业班,怎么样啊?给点意见可以吗? 我想去培训,因为嵌入式要是自学可能会走好多弯路,呜呜~~~…

查看全部问答>

9月10日.NET外企软件工程师班新班开课, 欢迎大家免费试听!

中美*爱*梯*科技, .NET外企软件工程师班将于2007年9月10日开课, 开课第一周免费试听, 欢迎大家踊跃报名参加!   公司网址:  http://www.happyit.com.cn   报名电话:  82240069 中 ...…

查看全部问答>

煤气报警器

求大哥大姐们给个基于51单片机做的煤气报警器,其中包含1602显示。。。。谢谢了。。。急!!!…

查看全部问答>

【每日一片】Stellaris MCU Part No. 第二个字符的意义

你知道 Stellaris MCU  Part No. 第二个字符的意义吗? …

查看全部问答>

甩卖了 149单片机的点菜机 带液晶屏

见谅啊第一次发帖,也不知发哪里了 有电池和充电器,点菜机充一次电待机1月,有JTAGE口2只160/2ps  说明书  还有宁茂RM5变频器 [ 本帖最后由 mgmg 于 2011-11-16 13:27 编辑 ]…

查看全部问答>

9B96开发板做做浏览器登录界面

9B96开发板做做浏览器登录界面 ,看了好多资料,还是感觉摸不到头脑,希望有人可以指点一下,谢谢。…

查看全部问答>

热电偶测量线路处于断路时的问题

请教各位大侠,如果热电偶测量线路处于断路状态,怎么才能让测量电路有所指示?…

查看全部问答>

华为FPGA设计流程指南

replyreload += \',\' + 1345501;华为FPGA设计流程指南   Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>