ARM System Developer's Guide 学习笔记 3.3 访存指令

访存指令

访存指令用于数据在存储器和处理器寄存器之间传递。有三种访存指令:单寄存器传输指令、多寄存器传输指令,交换指令。

1. 单寄存器传输指令

  • 概念:这些指令用于将单数据移入和移出寄存器。数据类型支持有符号和无符号字长(32-bits),半字长(16-bits)和字节。
  • 常用的单寄存器传输指令 及其 语法
常用的单寄存器传输指令 及其 语法

其中
addressing1(数据类型是word, unsigned byte)可用桶形移位器-比例因子是2的倍数;
addressing2(数据类型是半字,有符号半字,有符号字节,以及双字)。

  • LDR,STR 指令
    LDR只在存储器加载32-bit字长地址,4字节的倍数-0,4,8...。

示例1.1

以下示例为从寄存器r1中包含的内存地址进行加载,然后将存储返回到存储器中的相同地址。

寄存器r1:
第一条指令:加载寄存器r1指向的内存地址的内容到寄存器r0。

目标寄存器r0:
第二条指令:存储寄存器r0的内容到寄存器r1指向的内存地址。

r1 的偏移为0,寄存器r1为基地址寄存器。

LDR,STR 指令示例

单寄存器寻址模式

ARM指令集提供了不同的寻址模式。这些模式结合了索引方法:带写回的预索引,预索引和后索引。
索引方法如下表所示:


索引方法( ! 表示写回到基址寄存器)

示例1.2:

寻址前

  • 带写回的预索引
    通过基寄存器地址加上地址偏移的计算,然后更新基寄存器地址为新地址。该模式用于遍历数组。

解析
基寄存器r1:
r1地址和偏移量相加,新地址为:mem32[0x00009000+0x00000004] -- mem32[0x00009004],基寄存器r1地址更新为这个新地址:即 r1 = 0x00009004;

目标寄存器r0:
加载更新后的寄存器r1指向的内存地址的内容到r1。
mem32[0x00009004] = 0x02020202, r1现在地址存储的内容是 0x02020202,即r0 = 0x02020202

preindex with writeback
  • 预索引
    与上面相反,索引偏移和带写回的预索引一样但是不更新基寄存器地址。该模式用于在访问数据结构中的元素时间。
    解析
    基寄存器r1:
    r1地址和偏移量相加,新地址为:mem32[0x00009000+0x00000004] -- mem32[0x00009004],基寄存器r1地址地址不更新,不变,即 r1 = 0x00009000

    目标寄存器r0:
    r1的地址不变,但是由于偏移后的地址为0x00009004,mem32[0x00009004] = 0x02020202, 即r0 = 0x02020202

preindexing
  • 后索引
    当地址被用了以后只是更新基寄存器地址。该模式用于遍历数组。
    解析
    基寄存器r1:
    r1地址和偏移量相加,新地址为:mem32[0x00009000+0x00000004] -- mem32[0x00009004],因为地址被用了,所以只更新基寄存器r1地址更新为这个新地址:即 r1 = 0x00009004;

    目标寄存器r0:
    在这个模式下,目标寄存器加载源地址指向的内容。mem32[0x00009000] = 0x01010101, 即 r0 = 0x01010101。

postindexing
  • 小结:
    示例1.2 使用了preindex方法,展现了每一个索引方法是如何影响 寄存器 r1 地址的,以及加载到 寄存器 r0 中的数据内容。每一个指令展现了在同一个先决条件的索引方法结果。

  • 总结1:
    下表为LDR 指令的不同变化:


    不同寻址模式的LDR指令集
  • 总结2:
    下表为使用16-bits半字长或有符号字节数据访存时可用的寻址方式:

2. 多寄存器传输指令

  • 概念:多寄存器传输指令在一个指令下,可以在内存和寄存器中传递多个寄存器。传输从指向存储器的基地址寄存器Rn开始;多寄存器传输指令可提高效率,例如:数据块的操作,上下文切换,堆栈操作;
    多寄存器传输指令会增加中断延时(不会打断正在执行的指令)。ARM不支持经常中断当执行的时候。
    编译器比如armcc提供了switch指令可以控制一条load-store指令最大寄存器数目,限制了最大中断延迟。
  • 常用的多寄存器传输指令 及其 语法
多寄存器传输指令 及其 语法

下表为多寄存器传输指令的不同寻址模式,N 为寄存器个数。
基地址寄存器Rn决定了多寄存器传输指令的源地址和目标地址。通过下面的转换,寄存器可以自动更新。

多寄存器传输指令的不同寻址模式
  • IA 执行后增加

  • IB 执行前增加

  • DA 执行后减少

  • DB 执行前减少
    更新基地址的load-store指令对,用于类似成对的push pop操作,
    STMIA - LDMDB
    STMIB - LDMDA
    STMDA - LDMIB
    STMDB - LDMIA

  • LDMIA 指令示例:
    下例中,寄存器r0是基寄存器Rn阶乘,表示指令执行后更新寄存器。可以注意到,在多寄存器传输指令中寄存器没有单独列出,而是用符号 " - " 代表一段寄存器范围。在这个例子中,寄存器范围是从寄存器r1 到 r3。
    每一个寄存器可以列出,用圆括号 { 和 } 来分开每一个寄存器。


指令执行前

在先决条件下,基址寄存器r0指向的内存地址为 0x80010 ,内存地址0x80010,0x80014和0x80018上相应存储的值是0x01,0x02 和 0x03.

下图为图形表示:


LDMIA 指令 Per-condition 图形表示

多寄存器传输指令LDMIA执行后,寄存器r1, r2 和 r3 包含的值如下图所示:
基寄存器r0 在上个字长加载以后,现在指向内存地址 0x8001c。

LDMIA 指令 Post-condition 图形表示
指令执行后
  • LDMIB指令示例

使用和上面相同的LDMIA 指令 中的Per-condition,寄存器r0指向的第一个字长忽略,寄存器r1从下一个内存地址加载,如下图所示:

LDMIB 指令 Post-condition 图形表示

多寄存器传输LDMIB指令执行后,寄存器r0 现在指向最后一次被加载后的内存地址 0x8001c,和LDMIA指向下一个内存地址相反

LDMDALDMDB 指令从起始地址减少并存储到上升的内存地址。

使用增加和减少的多寄存器传输指令,可以前向和后向访问数组,允许堆栈的push和pull操作。

堆栈操作

ARM结构用多存储器传输指令执行堆栈操作。
pop : 从堆栈中移除数据
push: 数据放入堆栈
在使用堆栈时要决定是 ascending(A)还是 descending(D): 升序是堆栈朝着高地址增长,降序是朝着低地址增长。
堆栈3个属性,堆栈基址、堆栈指针(sp)、堆栈限制;
当使用full stack(F),sp指向最后一个地址或满地址;
当使用empty stack(E),sp指向第一个或空的地址。
ARM-Thumb过程调用标准(ATPCS)定义了例程如何被调用和寄存器如何分配;
ATPCS定义堆栈为递减式满堆栈(Descending-Full stack);
堆栈检查enable时,ATPCS定义r10为堆栈限制或sl(stack limit); 备注:push堆栈溢出错误,pop堆栈下溢(stack underflow)错误。
下表为支持堆栈操作的可用寻址方式:


支持堆栈操作的可用寻址方式

3. 交换指令

  • 概念:交换指令是一个特殊的访存指令。它交换内存个寄存器的内容。是原子操作,会占据总线,直至交换完成。
  • 常用的交换指令 及其 语法:


    交换指令 及其 语法

交换不能被其他指令或总线访问中断,这是系统占用总线直到完成。

  • 示例:Swap指令从内存加载一个字长到寄存器r0,然后用寄存器r1覆写内存。


    Swap指令示例

这个指令在一个操作系统中当生成信号量semaphore和互斥时特别有用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容