微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM学习手札之汇编伪指令

ARM学习手札之汇编伪指令

时间:11-22 来源:互联网 点击:

FN
FN 为一个FPA 浮点寄存器定义名称
伪指令格式:
name FN expr
其中:name 要定义的浮点寄存器名称。
expr 浮点寄存器的编号,值为0~7。
伪指令应用举例如下:
ibq FN l ;将浮点寄存器l 名称定义为ibq

A.4.2 数据定义伪指令
数据定义伪指令用于数据表定义,文字池定义,数据空间分配等。该类伪指令如下:
声明一个文字池:LTORG。
定义一个结构化的内存表的首地址:MAP。
定义结构化内存表中的一个数据域:FIELD。
分配一块内存空间,并用0 初始化:SPACE。
分配一段字节的内存单元,并用指定的数据初始化:DCB。
分配一段字的内存单元,并用指令的数据初始化:DCD 和DCDU。
分配一段字的内存单元,将每个单元的内容初始化为该单元相对于静态基址寄存器的偏移量:DCDO。
分配一段双字的内存单元,并用双精度的浮点数据初始化:DCFD 和DCFDU。
分配一段字的内存单元,并用单精度的浮点数据初始化:DCFS 和DCFSU。
分配一段字的内存单元,并用单精度的浮点数据初始化,指定内存单元存放的是代码,而不是数据:DCI。
分配一段双字的内存单元,并用64 位整数数据初始化:DCQ 和DCQU。
分配一段半字的内存单元,并用指定的数据初始化:DCW 和DCWU。

LTORG
LTORG 用于声明一个文字池,在使用LDR 伪指令时,要在适当的地址加入LTORG 声明文字池,这样就会把要加载的数据保存在文字池内,再用ARM 的加载指令读出数据。(若没有使用LTORG 声明文字池,则汇编器会在程序末尾自动声明。)
伪指令格式:
LTORG
伪指令应用举例如下:

LDR R0,=0x12345678
ADD R1,R1,R0
MOV PC,LR
LTORG ;声明文字池,此地址存储0x12345678
… ;其它代码
LTORG 伪指令常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误地将文字池中的数据当作指令来执行。

MAP
MAP 用于定义一个结构化的内存表的首地址。此时,内存表的位置计数器{VAR}设置为该地址值{VAR}为汇编器的内置变量。^与MAP 同义。
伪指令格式:
MAP expr,{base_register}
其中:expr 数字表达式或程序中的标号。当指令中没有
base_register 时,expr 即为结构化内存表的首地址。
base_register 一个寄存器。当指令中包含这一项时,结构化内存表的首地址为expr 与base_register 寄存器值的和。
伪指令应用举例如下:
MAP 0x00,R9 ;定义内存表的首地址为R9
Timer FIELD 4 ;定义数据域Timer,长度为4 字节
Attrib FIELD 4 ;定义数据域Attrib,长度为4 字节
String FIELD 100 ;定义数据域String,长度为100 字节

ADR R9,DataStart ;设置R9 的值,即设置结构化的内存表地址
LDR R0,Atrrib ;相当于LDR,R0,[R9,#4]

MAP 伪指令和FIELD 伪指令配合使用,用于定义结构化的内存表结构。MAP 伪指令中的base-register 寄存器的值对于其后所有的FIELD 伪指令定义的数据域是默认使用的,直到遇到新的包含base-register 项的MAP 伪指令。

FIELD
FIELD 用于定义一个结构化内存表中的数据域。#与FIELD 同义。
伪指令格式:
{tabel} FIELD expr
其中:label 当指令中包含这一项时,label 的值为当前内存表的位置计数器{VAR}的值,汇编编译器处理了这条FIELD 伪指令后,内存表计数器的值将加上expr。
expr 表示本数据域在内存表中所占用的字节数。
伪指令应用举例如下:
MAP 0x40003000 ;内存表的首地址为0x40003000
count1 FIELD 4 ;定义数据域count1,长度为4 字节
count2 FIELD 4 ;定义数据域count2,长度为4 字节
count3 FIELD 4 ;定义数据域count3,长度为4 字节
LDR R1,count1 ;R1=[0x40003000+0x00]
STR R1,count2 ;[0x40003000+0x00]=R1
MAP、FIELD 伪指令仅仅是定义数据结构,它们并不实际分配内存单元。

SPACE
SPACE 用于分配一块内存单元,并用0 初始化。%与SPACE 同义。
伪指令格式:
{label} SPACE expr
其中:label 内存块起始地址标号。
expr 所要分配的内存字节数。
伪指令应用举例如下:
AREA DataRA,DATA,READWROTE ;声明一数据段,名为DataRAM
DataBuf SPACE 1000 ;分配1000 字节空间

DCB
DCB 用于分配一段字节内存单元,并用伪指令中的expr 初始化。一般可用来定义数据表格,或文字符串。=与DCB 同义。
伪指令格式:
{label} DCB expr{,expr}{,expr}…
其中:label 内存块起始地址标号。
expr 可以为-128~255 的数值或字符串。内存分配的字节数由expr 个数决定。
伪指令应用举例如下
DISPTAB DCB 0x33,0x43,0x76,0x12
DCB -120,20,36,55
ERRSTR DCB “Send,data is error!”,0

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top