LOAD/STORE MULTIPLE(數(shù)據(jù)加載/存儲多個(gè)寄存器)

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] */

開始調(diào)試上面的代碼gdb ldr

下斷點(diǎn)

break _start

運(yùn)行

run          //運(yùn)行到斷點(diǎn)處

x/i $pc:查看接下來反匯編指令(60是10進(jìn)制數(shù)衰齐,轉(zhuǎn)成16進(jìn)制為3c)

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

使用i r pc查詢到 的pc當(dāng)前存儲的值為0x10074

pc             0x10074  0x10074 <_start>

也就是說下一條指令是用0x100b0=(0x10074+0x3c),賦值給r0把敢,但是實(shí)際并不是预茄,執(zhí)行下面的單步執(zhí)行 已卸,執(zhí)行完第一條指令,使用i r r0發(fā)現(xiàn)結(jié)果為0x100b8

r0             0x100b8  65720
為什么結(jié)果會比計(jì)算的值多8呢?

參考:什么時(shí)候PC+8,PC+4,PC-4,PC-8
[圖片上傳失敗...(image-cefda3-1543372618746)]
需要知道的點(diǎn):
1惑折、每條指令執(zhí)行有三個(gè)流程:取指、譯碼枯跑、執(zhí)行
2惨驶、當(dāng)?shù)谝粭l匯編指令取指完成后,緊接著就是第二條指令的取指敛助,然后第三條...如此嵌套
3粗卜、取指完成后,PC就指向了第二條指令辜腺,此時(shí)PC=PC+4
所以可以知道:第一條指令執(zhí)行的時(shí)候休建,也是第三條指令的取指的時(shí)候,即PC=PC+8

單步執(zhí)行

nexti/ni        //步入
stepi/si        //步過

adr r0, words+12:將words+12處的內(nèi)存地址獲取并存到r0评疗。
words+12->0x00000003(這個(gè)地址存儲的值)测砂,

i r r0        //獲取r0寄存器數(shù)據(jù):0x100b8
x/3w 0x100b8        //十六進(jìn)制,字類型查看0x100b8和其之后的兩個(gè)地址的數(shù)據(jù)
結(jié)果:0x100b8 <words+12>:  3   4   5

ldm r0, {r4, r5}

ldm 源百匆,目的寄存器:r0的值為內(nèi)存地址砌些,其指向的值附給r4,r0+4指向的值給r5

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

內(nèi)存地址指向的值
x/w    0x100b8      >>    3
x/w    0x100bc      >>    4

stm r1, {r4, r5}

stm 目的地址加匈,{源寄存器}:將寄存器中的值存璃,放入目的地址指向的位置處
執(zhí)行前:

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

執(zhí)行后si

x/2w 0x200d0
結(jié)果為:0x200d0:    0x3 0x4

ldmia、stmia

-IA(之后遞增)ldmldmia是相同的雕拼,每次加載下一條指令纵东,源地址都會增加4字節(jié)(一個(gè)字的值),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字節(jié)(一個(gè)字的值)

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:遞減情況下,目的寄存器是先賦值給后面辑甜,同樣從源寄存器中取指時(shí)也是先從后面取值

-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

知識點(diǎn)
PUSH:

  1. SP-4
  2. 數(shù)據(jù)存儲到SP指向的新地址處

POP

  1. SP的值先存儲到某個(gè)寄存器中
  2. SP+4

實(shí)例

.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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磷醋,一起剝皮案震驚了整個(gè)濱河市猫牡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邓线,老刑警劉巖淌友,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煌恢,死亡現(xiàn)場離奇詭異,居然都是意外死亡亩进,警方通過查閱死者的電腦和手機(jī)症虑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來归薛,“玉大人,你說我怎么就攤上這事匪蝙≈骷” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵逛球,是天一觀的道長千元。 經(jīng)常有香客問我,道長颤绕,這世上最難降的妖魔是什么幸海? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮奥务,結(jié)果婚禮上物独,老公的妹妹穿的比我還像新娘。我一直安慰自己氯葬,他們只是感情好挡篓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帚称,像睡著了一般官研。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闯睹,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天戏羽,我揣著相機(jī)與錄音,去河邊找鬼楼吃。 笑死始花,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的所刀。 我是一名探鬼主播衙荐,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浮创!你這毒婦竟也來了忧吟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤斩披,失蹤者是張志新(化名)和其女友劉穎溜族,沒想到半個(gè)月后讹俊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡煌抒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年仍劈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寡壮。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贩疙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出况既,到底是詐尸還是另有隱情这溅,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布棒仍,位于F島的核電站悲靴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏莫其。R本人自食惡果不足惜癞尚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乱陡。 院中可真熱鬧浇揩,春花似錦、人聲如沸蛋褥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烙心。三九已至膜廊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淫茵,已是汗流浹背爪瓜。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匙瘪,地道東北人铆铆。 一個(gè)月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像丹喻,于是被迫代替她去往敵國和親薄货。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • iOS逆向工程之Hopper中的ARM指令 一碍论、Hopper中的ARM指令 ARM處理器就不多說了谅猾,ARM處理器因...
    零度_不結(jié)冰閱讀 659評論 0 4
  • 原文地址 一、Hopper中的ARM指令A(yù)RM處理器就不多說了,ARM處理器因?yàn)榈凸牡仍蛩澳龋源蟛糠忠苿釉O(shè)備上...
    顏值不夠才華來湊閱讀 1,144評論 0 4
  • 組件 計(jì)算機(jī)是一種數(shù)據(jù)處理設(shè)備坐搔,它由CPU和內(nèi)存以及外部設(shè)備組成。CPU負(fù)責(zé)數(shù)據(jù)處理敬矩,內(nèi)存負(fù)責(zé)存儲概行,外部設(shè)備負(fù)責(zé)數(shù)...
    哆啦灬少A夢閱讀 1,590評論 1 2
  • 河在泛著粼粼的星光 漁火是岸上的太陽 微微的風(fēng) 來掀起你的波紋 涌出無限歌唱 拂了你的銀裝, 笑了今晚的桂香 我在...
    月鈴閱讀 258評論 2 4
  • 舊去新來時(shí)無常, 光陰苦短自磨長弧岳。 乃家此有花飛艷凳忙, 旦問團(tuán)圓與誰談。
    若水因因閱讀 134評論 0 1