📄 44b0x引导程序中伪指令详解.txt
字号:
LDR{condition} register,=[expression|Label-expression]
其中:
condition 可选的条件代码。
register 读取的寄存器。
expression 数字常量:
如果该数字常量在MOV或MVN指令的范围中,汇编器会产生合适的指令;
如果该数字量不在MOV或MVN指令的范围中,汇编器把该常量于程序后,用程序相关的LDR伪指令读取,PC与该常量的偏移量不得超过4KB。
Label-expression 程序相关的或外部的表达式。汇编器将其存放在程序后的常量库(称为文字池(literal pool))中,用程序相关的LDR伪指令读取,PC与与该常量的偏移量不得超过4KB。
LDR伪指令的使用有两个目的:
对于不能被MOV和MVN指令所读取的立即数,将其变成常量,进行读取。
将一个程序相关的或外部的表达式读取进寄存器中。
例:
LDR R1, =0xfff
LDR R2, =place
*****************************************************
十、DCD 0x11110090
;Bank0=OM[1:0], Bank1~Bank7=16bit, bank2=8bit;
//DCD或“&”
功能: 分配一个或多个字,从4个字节边界开始。
格式:
{label}DCD expression{,expression}…
其中:
expression 可以是:
一个数学表达式;
一个程序相关的表达式。
如果在Thumb代码中,使用DCD符号定义带标志的数据时则必须使用DATA符号。
按4个字节对准时,DCD符号会在第一个字节之前插入3个字节的空字符,如果无须对准的话,可以使用DCDU符号。
例:
datal DCD 1,5,20
data2 DCD mem06
data3 DCD glb+4
*****************************************************
十一、ALIGN
//功能:从1个字边界开始。
格式:
ALIGN {expression {,offset-expression} }
其中:
expression 2(上标为0)到2(上标为31)之间的任意数幂,当前按2(上标为n)字节对准,如果该参数没有指定,ALIGN将按字对准。
Offset-expression 定义expression指定的对准方式的字节偏移量。
使用ALIGN符号,保证程序正确对准。对于Thumb地址,使用ALIGN符号保证其按字对准,例如:ADR Thuub伪指令只能读取字对准的地址。
在代码段出现数据定义符时,使用ALIGE符号。当在代码段使用数据定义符(DCB,DCW,DCWU,DCDU和%),程序计数器PC并不一定按字对准。
汇编器会在下一条指令时插入3个字节,保证:
ARM状态下按字对准;
Thumb状态下按半字对准。
在Thumb状态下,可以使用ALIGN2对Thumb代码按半字对准。
使用ALIGN状态下,还可以充分利用一些ARM处理器的Cache,例如,ARM940T有一个每行4字的Cache,使用ALIGN16按16字节对准,从而最大限度使用Cache。
*****************************************************
十二、^ _ISR_STARTADDRESS
//MAP与"^"
MAP用于定义一个结构化的内存表(StorageMAP)的首地址。此时,内存表的位置计数器{VAR}(汇编器的内置变量)设置成该地址值。MAP可以用”^”代替。
语法:MAP expr {,base-register}
其中,expr为数字表达式或者是程序中已经定义过的标号。Base-register为一个寄存器。当指令中没有Base-register时,expr为结构化内存表的首地址。此时,内存表的位置计数器{VAR}设置成该地址值。当指令中包含这一项时,结构化内存表的首地址为expr和Base-register寄存器内容的和。
使用说明:MAP伪操作和FIELD伪操作配合使用来定义结构化的内存表结构。
举例:MAP伪操作
MAP fun ;fun就是内存表的首地址
MAP 0x100,R9 ;内存表的首地址为 R9+0x100
*****************************************************
十三、HandleReset # 4
HandleUndef # 4
HandleSWI # 4
//FIELD和"#"
FIELD 用于定义一个结构化的内存表中的数据域。FIELD 可用“#”代替。
语法:{label} FIELD expr
其中:{label}为可选的。当指令中包含这一项时,label的值为当前内存表的位置计数器{VAR}的值。汇编编译器处理了这条FIELD伪操作后。
内存表计数器的值将加上expr.expr表示本数据域在内存中所占的字节数。
使用说明:MAP伪操作和FIELD伪操作配合使用来定义结构化的内存表结构。MAP伪操作定义内存表的首地址。FIELD伪操作定义内存表的数据域的字节长度,并可以为每一格数据域指定一个标号,其他指令可以引用该标号。
MAP伪操作中的Base-registe寄存器值队以其后所有FIELD伪操作定义的数据域是默认使用的,直到遇到新的包含Base-registe项的MAP伪操作需要特别注意的是,MAP伪操作和FIELD伪操作仅仅是定义数据结构,他们并不实际分配内存单元。由MAP伪操作和FIELD伪操作配合定义的内存表有3种:基于绝对地址的内存表,基于相对地址的内存表和基于PC的内存表。
举例:基于绝对地址的内存表
用伪操作序列定义一个内存表,其首地址为固定的地址8192(0X2000),该内存表中包括5个数据域。
Consta长度为4个字节;constb长为4个字节,x长为8字节;y长为8字节;string长为16字节。这种内存表成为基于绝对地址的内存表。
MAP 8192 ; //内存表的首地址8192(0x2000)
Consta FIELD 4 ; //consta 长为4字节,相对位置为0
Constb FIELD 4; //constb长为4字节,相对位置为4
X FIELD 8; // X长为8字节,相对位置为8
Y FIELD 8; // y长为8字节,相对位置为16
String FIELD 16 ;// String为16字节,相对位置为24
在指令中,可以这样引用内存表中的数据域;
LDR R0,consta; //将consta地址处对应内存加载到R0上面的指令仅仅可以访问LDR指令前后4KB地址范围的数据域。
举例:相对绝对地址的内存表
下面的伪操作序列定义一个内存表,其首地址为0与R9寄存器值得和,该内存表中包含5个数据域。这种表称为相对地址的内存表。
MAP 0,R9;//内存表的首地址寄存器R9的值
Consta FIELD 4 ; //consta 长为4字节,相对位置为0
Constb FIELD 4; //constb长为4字节,相对位置为4
X FIELD 8; // X长为8字节,相对位置为8
Y FIELD 8; // y长为8字节,相对位置为16
String FIELD 16;// String为16字节,相对位置为24
可以通过下面的指令访问地址范围超过4KB的数据;
ADR R9, Field ; //伪指令
LDR R5,Constb;//相当于LDR R5,[R9,#4]
在这里,内存表中的数据都是相对于R9寄存器的内容,而不是相对于一个固定的地址。通过在LDR中指定不同的基址寄存器的值,定义的内存表结构可以在程序中有多个实例。可多次使用LDR指令,用以实现不同的程序实例。
举例:基于PC的内存表
Data SPACE 100 ; //分配100字节的内存单元,并初始化为0
MAP Data;//内存表的首地址为Datastruc内存单元
Consta FIELD 4 ; //consta 长为4字节,相对位置为0
Constb FIELD 4; //constb长为4字节,相对位置为4
X FIELD 8; // X长为8字节,相对位置为8
Y FIELD 8; // y长为8字节,相对位置为16
String FIELD 16;// String为16字节,相对位置为24
可以通过下面的指令访问范围不超过4kb的数据;
LDR R5,constb ;相当于 LDR R5,[PC,offset]
*****************************************************
十四、RN
在局部标号中:
%表示引用操作
F指示编译器只向前搜索。
B指示编译器只向后搜索。
A指示编译器搜索宏的所有嵌套层。
T指示编译器搜索宏的当前层次。
若F、B没有指定则先向前搜索,再向后搜索。
若A、T都没有指定则先从当前层到最高层,比当前层低的不再搜索。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1512102
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -