关于ARM汇编里的特殊符号--转 先前企图全部靠自己写一个bootloader,结果尝试了下,花了4天时间查各种技术资料,写了个startup.s文件出来,写的过程中才发现,原来还有很多问题是我基本上不知道的,比如说如何进行ARM的位操作、如何将堆栈设置到RAM中、UART的波特率计算方法等问题。
在边写边查资料的过程中,我又发现了别人的一些程序我看不懂。。。因为除了EQU、DCD等我基本不用伪指令。。。
所以我开始看44B0 BootLoader的范例程序,可能是人家水平实在比较高,也可能是俺的水平确实有限,总之是有些地方看不怎么懂,特别是一些个特殊符号,现特将那些个麻烦的符号总结下:
特殊符号 | 对应指令 | 含义 | 示例
-------------------|---------------------------------|----------------------------------|---------------------------------------
^ | MAP | 定义结构化内存表 | MAP 4096;内存表首地
| | | 址为4096
-------------------|---------------------------------|----------------------------------|---------------------------------------
# | FIELD | 定义内存表中的数 | MAP 4096
| | 据,结合MAP指令 | STACKSVC FIELD 256;
| | 使用。 | 定义从4096开始的256字节
| | |为SVC的堆栈空间。
-------------------|---------------------------------|----------------------------------|---------------------------------------
% | SPACE | 分配一块内存,并 | DataStruc SPACE 280
| | 用“0”初始化 | 分配280字节内存并初始化
-------------------|---------------------------------|----------------------------------|---------------------------------------
[|] | IF ELSE ENDIF | 条件编译,有选择的 | IF 逻辑表达式
| | 确定需要编译的代码 | 指令或伪指令
| | IF,ELSE,ENDIF | ELSE
| | 可以嵌套使用 | 指令或伪指令
| | | ENDIF
-------------------|---------------------------------|----------------------------------|---------------------------------------
另外还有符号: $
如果在串变量前有一个$则在汇编时编译器将用该串变量的数值取代该串变量,如:
GBLS STR1
GBLS STR2
STR1 SETS “pen.”
STR2 SETS “This is a $STR1'
编译后的结果是STR2的值为This is a pen.
如果$后是数字变量(与串变量区分),在汇编时编译器将该数字变量的数值转换成十六进制的串,然后用该十六进制的串取代$后的数字变量。
如果$后是逻辑变量,在汇编时编译器将该逻辑变量替换成它的取值(T或者F)。
如果程序中需要$,则用$$来表示,编译器将不进行变量替换。
GBLS STR1
GBLS B
GBLA NUM1
NUM1 SETA 14
B SETS “CHANGED”
STR1 SETS “abc$$B$NUM1”
编译结果STR1的值为:abcB0000000E。
注意:在两个竖线“|”之间的$并不表示进行变量替换,但如果“|”是在双引号内,则将进行变量替换。
使用点'.'来表示变量名的结束。
GBLS STR1
GBLS STR2
STR1 SETS “AAA”
STR2 SETS “bbb$STR1.CCC'
编译结果STR2值为bbbAAACCC
还有一个例外:“%”
“%”除了表示SPACE外还可以在局部标号中使用,具体意思见伪指令ROUT的使用示例:
◆ROUT
ROUT伪指令定义局部标好的有效范围
伪指令格式如下
{name} ROUT
其中 name 所定义的作用范围的名称
当没有使用ROUT伪指令时,局部标号的作用范围所在段ROUT伪令的作用范
围在本ROUT伪指令和下一个ROUT伪指令之间(指同一段中的ROUT伪指令)
伪指令应用举例如下:
routineA ROUT ;定义局部标号的有效范围,名称为routineA
......
3routineA ;routineA范围内的局部标号3
......
BEQ %4routineA ;若条件成立,跳转到routineA范围内的局部标号 4
......
BEQ %3routineA ;若条件成立,跳转到routineA范Iq内的局部标号 3
......
4routineA ;routineA范围内的局部标号4
......
otherstuff ROUT ;定义新的局部标号的有效范围
|