打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MAP和FIELD伪操作定义的内存表结构(绝对地址与相对地址的区别)

分为三种:

1.基于绝对地址的内存表

举例:
    用伪操作序列定义一个内存表,其首地址为固定的地址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字节,相对位置为8196
X   FIELD  8; // X长为8字节,相对位置为8200
Y    FIELD 8; // y长为8字节,相对位置为8208
String FIELD 16 ;// String为16字节,相对位置为8216
在指令中,可以这样引用内存表中的数据域;
LDR R0,consta; //将consta地址处对应内存加载到R0上面的指令仅仅可以访问LDR指令前后4KB地址范围的数据域。

2.基于相对地址的内存表

举例:
    下面的伪操作序列定义一个内存表,其首地址为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指令,用以实现不同的程序实例。

3.基于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]


具体在进行计算的时候,是怎么一回事呢!

1>绝对地址时,是相对于首地址来说的;

2>相对地址时,是相对于上一条指令来说的,在上一条指令的基础上加上地址;

 (还是感觉不对,等以后自己在琢磨吧!) 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
ARM立即数讲解--LDR和MOV的区别
关于adr指令的理解
Delphi写ShellCode获取Kernel32.DLL的地址. | 武稀松(wr960204)的博客
ARM下书写位置无关的代码
【z】ldr和adr在使用标号表达式作为操作数的区别
常用的汇编指令都有哪些?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服