STM32
直播中

好名字

9年用户 869经验值
擅长:可编程逻辑
私信 关注
[问答]

你知道STM32启动代码汇编伪指令有哪几种吗

伪指令EQU是什么意思?伪指令AREA又是什么?


回帖(1)

h1654155275.5954

2021-11-26 15:10:23
● 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} 为地址的寄存器中。
注意:
语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分