LOAD/STORE MULTIPLE(数据加载/存储多个寄存器)

https://azeria-labs.com/load-and-store-multiple-part-5/

.data

array_buff:
 .word 0x00000000             /* array_buff[0] */
 .word 0x00000000             /* array_buff[1] */
 .word 0x00000000             /* array_buff[2]. This element has a relative address of array_buff+8 */
 .word 0x00000000             /* array_buff[3] */
 .word 0x00000000             /* array_buff[4] */

.text
.global _start

_start:
 adr r0, words+12             /* address of words[3] -> r0 */
 ldr r1, array_buff_bridge    /* address of array_buff[0] -> r1 */
 ldr r2, array_buff_bridge+4  /* address of array_buff[2] -> r2 */
 ldm r0, {r4,r5}              /* words[3] -> r4 = 0x03; words[4] -> r5 = 0x04 */
 stm r1, {r4,r5}              /* r4 -> array_buff[0] = 0x03; r5 -> array_buff[1] = 0x04 */
 ldmia r0, {r4-r6}            /* words[3] -> r4 = 0x03, words[4] -> r5 = 0x04; words[5] -> r6 = 0x05; */
 stmia r1, {r4-r6}            /* r4 -> array_buff[0] = 0x03; r5 -> array_buff[1] = 0x04; r6 -> array_buff[2] = 0x05 */
 ldmib r0, {r4-r6}            /* words[4] -> r4 = 0x04; words[5] -> r5 = 0x05; words[6] -> r6 = 0x06 */
 stmib r1, {r4-r6}            /* r4 -> array_buff[1] = 0x04; r5 -> array_buff[2] = 0x05; r6 -> array_buff[3] = 0x06 */
 ldmda r0, {r4-r6}            /* words[3] -> r6 = 0x03; words[2] -> r5 = 0x02; words[1] -> r4 = 0x01 */
 ldmdb r0, {r4-r6}            /* words[2] -> r6 = 0x02; words[1] -> r5 = 0x01; words[0] -> r4 = 0x00 */
 stmda r2, {r4-r6}            /* r6 -> array_buff[2] = 0x02; r5 -> array_buff[1] = 0x01; r4 -> array_buff[0] = 0x00 */
 stmdb r2, {r4-r5}            /* r5 -> array_buff[1] = 0x01; r4 -> array_buff[0] = 0x00; */
 bx lr

words:
 .word 0x00000000             /* words[0] */
 .word 0x00000001             /* words[1] */
 .word 0x00000002             /* words[2] */
 .word 0x00000003             /* words[3] */
 .word 0x00000004             /* words[4] */
 .word 0x00000005             /* words[5] */
 .word 0x00000006             /* words[6] */

array_buff_bridge:
 .word array_buff             /* address of array_buff, or in other words - array_buff[0] */
 .word array_buff+8           /* address of array_buff[2] */

开始调试上面的代码gdb ldr

下断点

break _start

运行

run          //运行到断点处

x/i $pc:查看接下来反汇编指令(60是10进制数,转成16进制为3c)

 0x10074 <_start>:  add r0, pc, #60 ; 0x3c

使用i r pc查询到 的pc当前存储的值为0x10074

pc             0x10074  0x10074 <_start>

也就是说下一条指令是用0x100b0=(0x10074+0x3c),赋值给r0,但是实际并不是,执行下面的单步执行 ,执行完第一条指令,使用i r r0发现结果为0x100b8

r0             0x100b8  65720
为什么结果会比计算的值多8呢?

参考:什么时候PC+8,PC+4,PC-4,PC-8
[图片上传失败...(image-cefda3-1543372618746)]
需要知道的点:
1、每条指令执行有三个流程:取指、译码、执行
2、当第一条汇编指令取指完成后,紧接着就是第二条指令的取指,然后第三条...如此嵌套
3、取指完成后,PC就指向了第二条指令,此时PC=PC+4
所以可以知道:第一条指令执行的时候,也是第三条指令的取指的时候,即PC=PC+8

单步执行

nexti/ni        //步入
stepi/si        //步过

adr r0, words+12:将words+12处的内存地址获取并存到r0。
words+12->0x00000003(这个地址存储的值),

i r r0        //获取r0寄存器数据:0x100b8
x/3w 0x100b8        //十六进制,字类型查看0x100b8和其之后的两个地址的数据
结果:0x100b8 <words+12>:  3   4   5

ldm r0, {r4, r5}

ldm 源,目的寄存器:r0的值为内存地址,其指向的值附给r4,r0+4指向的值给r5

r0: 寄存其中的值
r0             0x100b8  0x100b8

内存地址指向的值
x/w    0x100b8      >>    3
x/w    0x100bc      >>    4

stm r1, {r4, r5}

stm 目的地址,{源寄存器}:将寄存器中的值,放入目的地址指向的位置处
执行前:

$r1  : 0x000200d0
$r4  : 0x3       
$r5  : 0x4 
x/2w 0x100d0   (0x000100d0指向的值>>0x0; 0x000100d4>>0x0)

执行后si

x/2w 0x200d0
结果为:0x200d0:    0x3 0x4

ldmia、stmia

-IA(之后递增)ldmldmia是相同的,每次加载下一条指令,源地址都会增加4字节(一个字的值),stmia也一样

ldmia r0, {r4-r6} /* r0 -> r4 = 0x03, r0+4 -> r5 = 0x04; r0+8 -> r6 = 0x05; */ 
stmia r1, {r4-r6} /* r4 -> r1 = 0x03; r5 -> r1+4 = 0x04; r6 -> r1+8 = 0x05 */

ldmib、stmib

-IB(之前递增):在加载下一条指令之前增加4字节(一个字的值)

ldmia r0, {r4-r6} /* r0 -> r0+4 = 0x03, r0+8 -> r5 = 0x04; r0+12 -> r6 = 0x05; */ 
stmia r1, {r4-r6} /* r4 -> r1+4 = 0x03; r5 -> r1+8 = 0x04; r6 -> r1+12 = 0x05 */

LDMDA、STMDA:递减情况下,目的寄存器是先赋值给后面,同样从源寄存器中取指时也是先从后面取值

-DA(之后递减)

ldmda r0, {r4-r6} /* r0 -> r6 = 0x03; r0-4 -> r5 = 0x02; r0-8 -> r4 = 0x01 */
stmda r2, {r4-r6} /* r6 -> array_buff[2] = 0x02; r5 -> array_buff[1] = 0x01; r4 -> array_buff[0] = 0x00 */

LDMDB、STMDB

-DB(之前递减)

ldmdb r0, {r4-r6} /* r0-4 -> r6 = 0x02; r0-8 -> r5 = 0x01; r0-12 -> r4 = 0x00 */
stmdb r2, {r4-r5} /* r5 -> r2-4 = 0x01; r4 -> r2-8 = 0x00; */

PUSH AND POP

知识点
PUSH:

  1. SP-4
  2. 数据存储到SP指向的新地址处

POP

  1. SP的值先存储到某个寄存器中
  2. SP+4

实例

.text
.global _start

_start:
   mov r0, #3
   mov r1, #4
   push {r0, r1}
   pop {r2, r3}
   stmdb sp!, {r0, r1}
   ldmia sp!, {r4, r5}
   bkpt

汇编后:

      0x10054 <_start+0>       mov    r0,  #3
      0x10058 <_start+4>       mov    r1,  #4
->   0x1005c <_start+8>       push   {r0,  r1}
      0x10060 <_start+12>      pop    {r2,  r3}
      0x10064 <_start+16>      push   {r0,  r1}
      0x10068 <_start+20>      pop    {r4,  r5}
      0x1006c <_start+24>      bkpt   0x0000
  • push:先从后面压入堆栈
 0x1005c <_start+8>       push   {r0,  r1}    //r0=3;r1=4

堆栈信息:
0xbefff2a8|+0x0000: 0x00000003  <-$sp
0xbefff2ac|+0x0004: 0x00000004
  • pop:先赋值给前面的寄存器
 0x10060 <_start+12>      pop    {r2,  r3}

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

推荐阅读更多精彩内容

  • iOS逆向工程之Hopper中的ARM指令 一、Hopper中的ARM指令 ARM处理器就不多说了,ARM处理器因...
    零度_不结冰阅读 659评论 0 4
  • 原文地址 一、Hopper中的ARM指令ARM处理器就不多说了,ARM处理器因为低功耗等原因,所以大部分移动设备上...
    颜值不够才华来凑阅读 1,138评论 0 4
  • 组件 计算机是一种数据处理设备,它由CPU和内存以及外部设备组成。CPU负责数据处理,内存负责存储,外部设备负责数...
    哆啦灬少A梦阅读 1,581评论 1 2
  • 河在泛着粼粼的星光 渔火是岸上的太阳 微微的风 来掀起你的波纹 涌出无限歌唱 拂了你的银装, 笑了今晚的桂香 我在...
    月铃阅读 256评论 2 4
  • 旧去新来时无常, 光阴苦短自磨长。 乃家此有花飞艳, 旦问团圆与谁谈。
    若水因因阅读 133评论 0 1