九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
[翻譯]ARM匯編簡介(四)內(nèi)存指令-加載和存儲(chǔ) (上)

內(nèi)存指令:加載和存儲(chǔ)


ARM使用載入-存儲(chǔ)模型來訪問內(nèi)存,意味著只有加載/存儲(chǔ)(LDR和STR)指令才可以訪問內(nèi)存。在X86中,大多數(shù)指令允許直接操作內(nèi)存中的數(shù)據(jù),而在ARM中,在操作數(shù)據(jù)之前,必須把數(shù)據(jù)從內(nèi)存移動(dòng)到寄存器中。這意味著在ARM下,若要增加特定內(nèi)存地址里的32位的數(shù)值,將需要用到三種類型的指令(載入、增加和存儲(chǔ)):首先將特定地址里的數(shù)值加載到寄存器中,然后在寄存器中增加它,最后將數(shù)據(jù)從寄存器返存回內(nèi)存里。


為了解釋ARM的加載和存儲(chǔ)操作的基本原理,我們從一個(gè)基本示例開始,使用三種基本偏移形式,每個(gè)偏移形式都用三種不同的尋址模式表示。對于每個(gè)示例,我們將借助不同的LDR/STR偏移形式, 并使用含義相同匯編代碼讓問題簡化。學(xué)習(xí)教程的這一部分的最佳方法是在你的實(shí)驗(yàn)環(huán)境中用調(diào)試器(GDB)來運(yùn)行示例代碼。

1. 偏移形式:將立即數(shù)作為偏移

   尋址模式:偏移尋址

   尋址模式:先索引尋址

   尋址模式:后索引尋址

2. 偏移形式:將寄存器作為偏移

  尋址模式:偏移尋址

   尋址模式:先索引尋址

  尋址模式:后索引尋址

3. 偏移形式:將移位寄存器作為偏移

   尋址模式:偏移尋址

   尋址模式:先索引尋址

   尋址模式:后索引尋址


第一個(gè)基本示例
通常,LDR用于將內(nèi)存數(shù)據(jù)加載到寄存器中,STR用于從寄存器的值存儲(chǔ)到內(nèi)存地址對應(yīng)的內(nèi)存中。

LDR操作:將在R0中找到的地址的值加載到目標(biāo)寄存器R2。
STR操作:將R2中找到的值存儲(chǔ)在R1中找到的內(nèi)存地址中。

下面是它在功能匯編程序中的樣子:

在底部,我們有一個(gè)文本池(和代碼段在同一內(nèi)存區(qū)段,用于存儲(chǔ)常量,字符串,或者偏移。其他可以以單獨(dú)定位的形式來引用它們),在本例中,我們使用標(biāo)簽adr_var1和adr_var2來存儲(chǔ)var1變量和var2變量(在頂部的數(shù)據(jù)段中定義的)的內(nèi)存地址。第一個(gè)LDR指令將var1的地址加載到寄存器R0中。第二個(gè)LDR指令對var2做了同樣的事并將其加載到R1。然后,將存儲(chǔ)在R0中的內(nèi)存地址加載到R2里,并將R2中找到的值存儲(chǔ)在R1中找到的內(nèi)存地址中。


當(dāng)我們將某數(shù)據(jù)加載到寄存器中時(shí),方括號(hào)([])表示:從這些括號(hào)之間的寄存器找出的值是一個(gè)內(nèi)存地址,我們要加載的數(shù)據(jù)就是從該內(nèi)存地址中取出的。
當(dāng)我們將某數(shù)據(jù)存儲(chǔ)到內(nèi)存位置時(shí),方括號(hào)([])表示:從這些括號(hào)之間的寄存器找出的值是一個(gè)內(nèi)存地址,我們要存儲(chǔ)的數(shù)據(jù)就是從該內(nèi)存地址中取出的。


上述表述和實(shí)際情況相比要復(fù)雜得多,所以貼出下圖,是調(diào)試器上執(zhí)行代碼時(shí)對內(nèi)存和寄存器進(jìn)行的可視化表示:

我們來看看同樣的代碼在調(diào)試器里是什么樣子的

前兩個(gè)LDR操作中用到的標(biāo)簽變成了 [pc, #12]。這叫做PC相對尋址。因?yàn)槲覀円褂脴?biāo)簽,所以編譯器計(jì)算出了文本池(PC+12)中指定標(biāo)簽的位置。你既可以用這個(gè)方法自己計(jì)算出數(shù)據(jù)所在的精確的位置,也可以像之前那樣使用標(biāo)簽。唯一的區(qū)別是,比起使用標(biāo)簽的辦法,你需要自己計(jì)算你的數(shù)值在文字池中的確切位置。在當(dāng)前這種情形下,文本池是在PC有效位的3個(gè)指令之后(4 + 4 + 4=12)。更多關(guān)于PC相對尋址的知識(shí)將本章稍后講解。

邊注:如果你忘記了為什么有效PC位于當(dāng)前的兩個(gè)指令之后,在本教程第二部分中曾介紹過:[……在執(zhí)行期間,ARM狀態(tài)下PC里存儲(chǔ)的是當(dāng)前指令的地址加上8(兩個(gè)ARM指令的長度),在Thumb狀態(tài)下存儲(chǔ)著當(dāng)前指令加上4(兩個(gè)Thumb指令的長度)的值。這與x86不同里PC總是指向下一個(gè)要執(zhí)行的指令不同。如下圖所示


 1. 第一種偏移形式:立即數(shù)用作偏移


這里我們使用一個(gè)立即數(shù)(整數(shù))作為偏移量。這個(gè)值通過與基址寄存器(下面的例子中的R1)相加或相減來訪問數(shù)據(jù)。它在編譯時(shí)為已知的偏移量。

我們調(diào)用這個(gè)程序ldr.s,在GDB中編譯并運(yùn)行它,看看會(huì)發(fā)生什么

在GDB(用gef)中在at _start設(shè)置一個(gè)斷點(diǎn)并且運(yùn)行程序

在我的系統(tǒng)中的寄存器現(xiàn)在被充滿了以下值(記住,這些地址可能是與您的系統(tǒng)上的值不同):


下一個(gè)將被執(zhí)行的指令是一條帶有偏移地址模式的STR指令(譯者注: str r2, [r1, #2])。它將R2(0x00000003)存儲(chǔ)到R1(0x00001009C)中指定的內(nèi)存地址+偏移量(#2)=0x1009E所指向的內(nèi)存空間中。


下一個(gè)STR操作(譯者注:str r2, [r1, #4]!)使用先索引尋址模式。你可以通過感嘆號(hào)識(shí)別這個(gè)模式(?。?。和偏移尋址唯一的區(qū)別是,基址寄存器將被最終的內(nèi)存地址更新,這個(gè)內(nèi)存地址里儲(chǔ)存了R2的值。這意味著,我們將在R2的值(0x3)存儲(chǔ)到R1中指定的內(nèi)存地址
(0x1009C)+偏移(#4)=0x100A0指定的內(nèi)存空間中,并用這個(gè)確切的地址更新R1。

最后一個(gè)LDR指令( ldr r3, [r1], #4)使用后索引尋址模式。這意味著基址寄存器(R1)作為最終地址,然后被R1+4計(jì)算結(jié)果更新。換句話說,它需要取出R1(不是R1+ 4)的值0x100A0,將其作為地址取出內(nèi)容,加載到R3中,然后將R1更新為R1(0x100A0)+偏移(#4)=0x100A4。

下面是對正在發(fā)生的事情的一個(gè)抽象說明:

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
ARM匯編語言指令總結(jié)
關(guān)于CM3的指令系統(tǒng)詳解
5. 從0學(xué)ARM
ARM
周立功版嵌入式課后習(xí)題答案
arm匯編指令
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服