RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ARM指令:adr和ldr的用法區(qū)別

如意 ? 來源:CSDN ? 作者:孫曉明 ? 2020-06-20 10:20 ? 次閱讀

同學(xué)們在學(xué)習(xí)ARM指令時,多數(shù)都會對adr和ldr這兩個命令產(chǎn)生疑惑,那他們究竟有什么區(qū)別呢?

其實這兩個都是偽指令:adr是小范圍的地址讀取偽指令,ldr是大范圍的讀取地址偽指令。可實際上adr是將基于PC相對偏移的地址值或基于寄存器相對地址值讀取的為指令,而ldr用于加載32為立即數(shù)或一個地址到指定的寄存器中。到這兒就會看到其中的區(qū)別了。如果在程序中想加載某個函數(shù)或者某個在聯(lián)接時候指定的地址時請使用adr,例如在lds中需要重新定位的地址。當(dāng)加載32為的立即數(shù)或外部地址時請用ldr。

我給大家先舉個例子:

AREA test,CODE,READONLY

ENTRY

ldr r0,_start

adr r0,_start

ldr r0,=_start

nop

_start

nop

END

這段代碼并無實際意義,只是為了方便說明。我們反匯編一下看看:

4: ldr r0,_start

0x00000000 E59F0008 LDR R0,[PC,#0x0008]

5: adr r0,_start

0x00000004 E28F0004 ADD R0,PC,#0x00000004

6: ldr r0,=_start

0x00000008 E59F0004 LDR R0,[PC,#0x0004]

7: nop

8:

9:

10: _start

0x0000000C E1A00000 NOP

11: nop

ldr r0, _start

從內(nèi)存地址 _start 的地方把值讀入。執(zhí)行這個后,r0 = 0xe1a00000

adr r0, _start

取得 _start 的地址到 r0,但是請看反編譯的結(jié)果,它是與位置無關(guān)的。其實取得的時相對的位置。例如這段代碼在 0x00000000 運行,那么 adr r0, _start 得到 r0 = 0x00000010;

ldr r0, =_start

這個取得標號 _start 的絕對地址。這個絕對地址是在 link 的時候確定的??瓷先ミ@只是一個指令,但是它要占用 2 個 32bit 的空間,一條是指令,另一條是 _start 的數(shù)據(jù)(因為在編譯的時候不能確定 _start 的值,而且也不能用 mov 指令來給 r0 賦一個 32bit 的常量,所以需要多出一個空間存放 _start 的真正數(shù)據(jù),在這里就是 0x0000000c)。

因此可以看出,這個是絕對的尋址,不管這段代碼在什么地方運行,它的結(jié)果都是 r0 = 0x0000000c。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9084

    瀏覽量

    367380
  • adr
    adr
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    11493
  • LDR
    LDR
    +關(guān)注

    關(guān)注

    0

    文章

    99

    瀏覽量

    7585
收藏 人收藏

    評論

    相關(guān)推薦

    你聽說過MIPS嗎?它和ARM有何區(qū)別?

    基于MIPS指令集的君正X2000處理器。有些工程師對于MIPS不怎么了解,究竟MIPS和ARM有何區(qū)別呢?本期文對MIPS做一個簡單介紹。MIPS和ARM都屬于
    的頭像 發(fā)表于 11-23 01:05 ?195次閱讀
    你聽說過MIPS嗎?它和<b class='flag-5'>ARM</b>有何<b class='flag-5'>區(qū)別</b>?

    RISC-V和arm指令集的對比分析

    RISC-V和ARM指令集是兩種不同的計算機指令集架構(gòu),它們在多個方面存在顯著的差異。以下是對這兩種指令集的詳細對比分析: 一、設(shè)計理念 RISC-V :RISC-V的設(shè)計理念是簡化
    發(fā)表于 09-28 11:05

    ARM處理器的指令集包括哪些

    ARM處理器的指令集是一個龐大而復(fù)雜的系統(tǒng),它涵蓋了多種類型的指令,用于實現(xiàn)數(shù)據(jù)處理、程序控制、內(nèi)存訪問等多種功能。
    的頭像 發(fā)表于 09-10 11:15 ?522次閱讀

    ARM處理器和CISC處理器的區(qū)別

    ARM處理器和CISC(復(fù)雜指令集計算機)處理器在多個方面存在顯著的區(qū)別。這些區(qū)別主要體現(xiàn)在架構(gòu)原理、性能與功耗、設(shè)計目標、應(yīng)用領(lǐng)域以及市場生態(tài)等方面。
    的頭像 發(fā)表于 09-10 11:10 ?448次閱讀

    三菱PLC傳送指令用法

    三菱PLC(可編程邏輯控制器)在工業(yè)自動化領(lǐng)域中扮演著至關(guān)重要的角色。其中,傳送指令(MOV)作為PLC編程中的基礎(chǔ)指令之一,其正確使用對于實現(xiàn)數(shù)據(jù)的準確、高效傳輸至關(guān)重要。本文將詳細講解三菱PLC傳送指令(MOV)的
    的頭像 發(fā)表于 06-18 09:41 ?4086次閱讀

    PLC中ALT和ALTP指令區(qū)別

    在PLC(可編程邏輯控制器)編程中,ALT和ALTP是兩個重要的指令,它們各自具有獨特的功能和應(yīng)用場景。本文將從多個方面對這兩個指令進行詳細的分析和比較,以便讀者能夠更深入地理解它們之間的區(qū)別
    的頭像 發(fā)表于 06-17 16:42 ?3593次閱讀

    PLC中SFTL指令用法

    Left Logical)指令是PLC指令集中的一種重要指令,用于處理數(shù)據(jù)的左移操作。本文將詳細闡述PLC指令SFTL的用法,包括其定義、
    的頭像 發(fā)表于 06-15 17:48 ?3275次閱讀

    數(shù)控車床m99指令用法

    詳細介紹M99指令用法。 一、M99指令的基本含義 M99指令是數(shù)控車床編程中的一個輔助功能代碼,其基本含義是“程序結(jié)束并返回到程序開始處”。在數(shù)控車床的程序中,M99
    的頭像 發(fā)表于 06-14 15:52 ?4712次閱讀

    adrldr什么區(qū)別

    adrldr什么區(qū)別 還有為啥arm 匯編能反匯編不都已經(jīng)是匯編了?
    發(fā)表于 05-17 06:27

    FPGA與ARM的本質(zhì)區(qū)別

    FPGA(Field-Programmable Gate Array)與ARM在多個方面存在本質(zhì)區(qū)別。 首先,從它們的定義和結(jié)構(gòu)上來看,F(xiàn)PGA是一種現(xiàn)場可編程門陣列,屬于可編程器件的一種。它的內(nèi)部
    發(fā)表于 04-28 09:00

    FPGA與ARM的本質(zhì)區(qū)別是什么?

    FPGA(Field-Programmable Gate Array)與ARM在多個方面存在本質(zhì)區(qū)別。 首先,從它們的定義和結(jié)構(gòu)上來看,F(xiàn)PGA是一種現(xiàn)場可編程門陣列,屬于可編程器件的一種。它的內(nèi)部
    發(fā)表于 04-28 08:56

    loop指令用法及功能

    循環(huán)指令是計算機編程中的一種基本控制結(jié)構(gòu),用于重復(fù)執(zhí)行特定的代碼塊,以實現(xiàn)重復(fù)操作、批處理和自動化等功能。循環(huán)指令在編程中具有廣泛的應(yīng)用場景,并且使用循環(huán)可以大大提高代碼效率和減少冗余。 循環(huán)指令
    的頭像 發(fā)表于 02-14 16:12 ?2160次閱讀

    arm架構(gòu)和x86架構(gòu)區(qū)別 linux是x86還是arm

    ARM架構(gòu)和x86架構(gòu)是兩種不同的計算機處理器架構(gòu),它們在體系結(jié)構(gòu)、指令集、應(yīng)用領(lǐng)域等方面有著明顯的區(qū)別。Linux操作系統(tǒng)則具有廣泛的適配性,可以運行在各種架構(gòu)上,包括x86和ARM
    的頭像 發(fā)表于 01-30 13:46 ?1.8w次閱讀

    ARM指令的尋址方式有幾種?試分別舉例說明

    ARM指令的尋址方式有幾種?試分別舉例說明? ARM指令集的尋址方式有基址尋址、立即尋址、寄存器尋址、寄存器間接尋址、寄存器相對尋址、相對基址尋址等多種方式。下面將逐一詳細介紹這些尋址
    的頭像 發(fā)表于 01-29 18:10 ?2215次閱讀

    三菱FX系列PLC置位與復(fù)位指令的使用教程

    有關(guān)三菱PLC置位與復(fù)位指令的功能說明,以FX2N為例,介紹其基本邏輯指令和步進指令用法,置位與復(fù)位指令(SET/RST),SET 、RS
    發(fā)表于 12-26 10:19 ?4612次閱讀
    三菱FX系列PLC置位與復(fù)位<b class='flag-5'>指令</b>的使用教程
    RM新时代网站-首页