国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

ARM 中 LDR偽指令

發(fā)布者:電子創(chuàng)意達(dá)人最新更新時間:2024-09-06 來源: cnblogs關(guān)鍵字:ARM  LDR偽指令 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

我們知道ARM CPU中有一條被廣泛使用的指令LDR,它主要是用來從存儲器(確切地說是地址空間)中裝載數(shù)據(jù)到通用寄存器。但不論是ARMASM還是GNU ARM AS,都提供了一條與之同名的偽指令LDR,而在實(shí)際中使用該偽指令的情況也較多,那他們有什么不同呢?下面我談?wù)勎业睦斫狻?/span>


由于我使用GNU工具鏈,所以以下的內(nèi)容都以GNU AS的ARM語法為準(zhǔn)。


LDR偽指令的語法形式如下:

LDR , =


這個常量表達(dá)式中可以包含Label(在ARM匯編中Label會在連接時解釋為一個常數(shù)),且其中的常數(shù)前不加#符號。


1 .equ    STACK_BASE, 0x0c002000

2 .equ    STACK_SIZE, 0x00001000

4 .text

5     ldr    sp, = STACK_BASE

6     ldr    sl, = STACK_BASE - STACK_SIZE

7     ldr    pc, = entry


這是一個合法的匯編文件,它把堆?;吩O(shè)為0x0c002000,棧限設(shè)為0x0c001000,然后跳到entry所標(biāo)識的C程序中執(zhí)行。


下面我們假設(shè)符號“entry”的地址為0x0c000000。


我們?nèi)绻焉厦娲a寫成:


1 .text

2     mov    sp, #0x0c002000

3     mov    sl, #0x0c001000

4     mov    pc, #0x0c000000

 

匯編器會報(bào)錯:

demo.s: Assembler messages:

demo.s:2: Error: invalid constant -- `mov sp,#0x0c002000'

demo.s:3: Error: invalid constant -- `mov sl,#0x0c001000'


說起這個錯誤的原因可就話長了,簡而言之是因?yàn)镽ISC有一個重要的概念就是所有指令等長。在ARM指令集中,所有指令長度為4字節(jié)(Thumb指令是2 字節(jié))。那問題就來了,4字節(jié)是不可能同時存的下指令控制碼和32位立即數(shù)的,那么我要把一個32位立即數(shù)(比如一個32位地址值)傳送給寄存器該怎么 辦?


RISC CPU提供一個通用的方法就是把地址值作為數(shù)據(jù)而不是代碼,從存儲器中相應(yīng)的位置讀入到寄存器中,待會我們會看到這樣的例子。


此外ARM還提供另一種方案。由于傳送類指令的指令控制碼部分(cond, opcode, S, Rd, Rn域)占去了20個字節(jié),那能提供給立即數(shù)的就只剩12個位了。


ARM并未使用這12個位來直接存一個12位立即數(shù),而是使用了類似有效數(shù)字一樣的概念,只存8個字節(jié)的有效位和一個4位的位偏移量(偏移單位為2)。這個東西在ARM被叫做術(shù)語immed_8,有興趣的人可以找資料了解一下,到處都有介紹。


可以看出ARM的這個方法能直接使用的立即數(shù)是相當(dāng)有限的,像0xfffffff0這樣的數(shù)顯然無法支持。別著急,ARM的傳送類指令中還有一個MVN指 令可以解決該問題。顯然0x0000000f是一個有效立即數(shù),MVN會先將其取反再傳送,這樣有效立即數(shù)的范圍又?jǐn)U充了一倍。


可就算如此仍有大量的32位立即數(shù)是無效的,比如上面那個例子中的0x0c002000和0x0c001000。面對這種問題一是使用RISC的通用方法,二是分次載入。


比如可以這樣載入0x0c002000:


1 .text

2     mov    sp, #0x0c000000

3     add    sp, sp, #0x00002000

 


或者:


.text

    mov    sp, #0x0c000000

    orr    sp, sp, #0x00002000

 


感覺很狡猾是吧,呵呵。但是要注意它和方法一的一大區(qū)別:需要多條指令。那么在一些對指令數(shù)目有限制的場合就無法使用它,比如異常向量表處要做長跳轉(zhuǎn)(超過±32MB)的話就只能用方法一;還有就是在同步事務(wù)中該操作不是原子的,因此可能需要加鎖。


扯了這么多再回到LDR偽指令上來。顯然上面的內(nèi)容是復(fù)雜繁瑣的,如果然程序員在寫程序的時候還要考慮某個數(shù)是不是immed_8一定超級麻煩,因此為了減輕程序員的負(fù)擔(dān)才引入了LDR偽指令。


你一定很好奇第一段代碼demo.s被GNU AS變成了什么,好,讓我們在Linux環(huán)境下執(zhí)行下面的命令:

        arm-elf-as -o demo.o demo.s

        arm-elf-objdump -D demo.o


結(jié)果:


demo.o:     file format elf32-littlearm


Disassembly of section .text:


00000000 <.text>:

   0:   e59fd004        ldr     sp, [pc, #4]    ; c <.text+0xc>

   4:   e59fa004        ldr     sl, [pc, #4]    ; 10 <.text+0x10>

   8:   e59ff004        ldr     pc, [pc, #4]    ; 14 <.text+0x14>

   c:   0c002000        stceq   0, cr2, [r0]

  10:   0c001000        stceq   0, cr1, [r0]

  14:   00000000        andeq   r0, r0, r0

Disassembly of section .data:


由于entry還沒連上目標(biāo)地址,objdump反匯編會認(rèn)為是0,我們先不管它。另外兩條LDR偽指令變成了實(shí)際的LDR指令!但目標(biāo)很奇怪,都是[pc, #4]。那好我們看看[pc, #4]是什么。



我們知道pc中存放的是當(dāng)前指令的下下條指令的位置,也就是. + 8。那么上面的第一條指令ldr sp, [pc, #4]中的pc就是0x8,pc + 4就是0xc,而[0xc]的內(nèi)容正是0x0c002000;同理,第二條ldr指令也是如此。顯然這里L(fēng)DR偽指令采用的是RISC通用的方法。


另外要說的是,如果LDR的是一個immed_8或者immed_8的反碼數(shù),則會直接被解釋成mov或mvn指令。如ldr pc, = 0x0c000000會被解釋成mov pc, 0x0c000000。


最后一點(diǎn)補(bǔ)充,我發(fā)現(xiàn)arm-elf-gcc通常都用累加法。如C語句中的i = 0x100ffc04;會變成類似于以下的語句:

       mov   r0, #0x10000004

       add   r0, r0, #0x000ff000

       add   r0, r0, #0x00000c00

       ...

原因不詳。


關(guān)鍵字:ARM  LDR偽指令 引用地址:ARM 中 LDR偽指令

上一篇:在嵌入式Linux系統(tǒng)(OK6410)中移植Boa 服務(wù)器
下一篇:OK6410 rmmod卸載模塊失?。篘o such file or directory

推薦閱讀最新更新時間:2025-06-17 20:27

ARM匯編ADR,LDR偽指令
arm中LDR偽指令與LDR加載指令LDR偽指令的形式是 LDR Rn,=expr 。下面舉一個例子來說明它的用法。 COUNT EQU 0x40003100 LDR R1,=COUNT MOV R0,#0 STR R0, COUNT是我們定義的一個變量,地址為0x40003100.這中定義方法在匯編語言中是很常見的,如果使用過單片機(jī)的話,應(yīng)該都熟悉這種用法。 LDR R1,=COUNT是將COUNT這個變量的地址,也就是0x40003100放到R1中。 MOV R0,#0是將立即數(shù)0放到R0中。最后一句STR R0, 是一個典型的存儲指令,將R0中的值放到以R1中的值為地址的存儲單元去。實(shí)際就是將0放到地址為0x40003100
[單片機(jī)]
解決方法:編譯IMX6ULL裸機(jī)串口程序提示錯誤arm-none-eabi-ld: cannot find -lgcc: 沒有那個文件或目
一、問題 編譯IMX6ULL野火裸機(jī)串口程序出現(xiàn)錯誤: make : 進(jìn)入目錄“/home/leung/embed_linux_driver_tutorial_imx6_code-master/bare_metal/uart/device” arm-none-eabi-gcc -fno-builtin -I/home/leung/embed_linux_driver_tutorial_imx6_code-master/bare_metal/uart/include -c led.c arm-none-eabi-gcc -fno-builtin -I/home/leung/embed_linux_driver_tutorial_i
[單片機(jī)]
解決方法:編譯IMX6ULL裸機(jī)串口程序提示錯誤<font color='red'>arm</font>-none-eabi-ld: cannot find -lgcc: 沒有那個文件或目
7.arm匯編 bic和orr指令
1. bic BIC指令的格式為: BIC{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2 BIC指令用于清除操作數(shù)1的某些位,并把結(jié)果放置到目的寄存器中。 操作數(shù)1應(yīng)是一個寄存器, 操作數(shù)2可以是一個寄存器、被移位的寄存器、或一個立即數(shù)。 操作數(shù)2為32位的掩碼,如果在 掩碼中置了某一位1,則清除這一位。未設(shè)置的掩碼位保持不變。 bic r0,r0,#0x1f 0x1f=11111b 其含義:清除r0的bit 位。 2. orr ORR指令的格式為: ORR{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2 ORR指令用于在兩個操作數(shù)上進(jìn)行邏輯戒運(yùn)算,并把結(jié)果放置到目的寄存器中。 操作數(shù)1應(yīng)該是一 個寄存器,操作數(shù)2可以是一個
[單片機(jī)]
嵌入式開發(fā)學(xué)習(xí)(1)<ARM體系結(jié)構(gòu)>
內(nèi)核版本號 SoC版本號 芯片型號(三星) ARMv1 (這里的v表示version) ...... ARMv4 ARM7 S3C44B0 ARMv4 ARM9 S3C2440 S3C2410 ARMv5 ARM+XScale ARMv6 ARM11 S3C6410 ARMv7 Cortex-M(微) Cortex-A(應(yīng)用) Cortex-R(實(shí)時) Cortex-A8 S5PV210 SP5C100 Cortex-A9 Exynos4412 Cortex-A7 全志A10 A20 A31 Cortex-A15 exynos5250 5450 Cortex
[單片機(jī)]
LINUX下ARM匯編的常用指令解析
1.ldr 和 str : (1) ldr 作為指令,叫做寄存器加載指令。將內(nèi)存中的值加載到寄存器中。 (2) ldr 作為偽指令,實(shí)現(xiàn)一個32位常數(shù)或地址值加載到寄存器中。后面加載的常量或地址值標(biāo)號前面必須有一個 “=” ,編譯器會將偽指令替換成指令實(shí)現(xiàn)。 (3) str 將寄存器中的值保存到內(nèi)存單元中。 2..long 偽操作,給數(shù)值分配內(nèi)存單元。 start: virable: .long start 如上,表示將start表示的值存到virable所代表的內(nèi)存中。 virable: .long 0x66666666 如上,表示將0x66666666存入virable所在的內(nèi)存單元中。 3.adr
[單片機(jī)]
ARM9無線遙控視頻實(shí)時監(jiān)控小車(二)--------攝像頭舵機(jī)控制模塊
舵機(jī)控制原理及使用說明更具一下地址的文件就可以了 http://wenku.baidu.com/view/8902f4125f0e7cd18425361d.html 最主要是的怎么樣讓我的ARM開發(fā)板產(chǎn)生PWM波 S3C2440的開發(fā)板上義工也就5個定時器 我主要用的是定時器0和定時器1,可以根據(jù)自己的手冊找到他們所在的位置 我的ARM班的兩個GPB0和GPB1分別對應(yīng)開發(fā)板上的蜂鳴器和R47 因?yàn)槲也挥靡壕了杂玫鬐PB0是沒有關(guān)系的,還有我把蜂鳴其給卸了 接下來是編寫驅(qū)動,定時器驅(qū)動網(wǎng)上有很多參考的推薦看樓下的,第一篇看不懂看第二篇 http://apps.hi.baidu.com/share/detail/
[單片機(jī)]
摩芯半導(dǎo)體基于Arm平臺持續(xù)攻關(guān)汽車高安全實(shí)時處理器芯片
近日,無錫摩芯半導(dǎo)體有限公司(以下簡稱“摩芯半導(dǎo)體”)與安謀科技(中國)有限公司(以下簡稱“安謀科技”)達(dá)成合作。摩芯半導(dǎo)體將基于Arm? Cortex? -R52以及更高端的Cortex-R系列平臺,結(jié)合自身卓越的技術(shù)研發(fā)實(shí)力,研發(fā)提供高安全、高實(shí)時處理器芯片,以滿足車載市場對于高效能、高可靠和安全控制功能的迫切需求。 摩芯半導(dǎo)體成立于2021年11月,是江蘇省潛在獨(dú)角獸企業(yè),公司總部位于無錫,并在深圳、成都設(shè)有研發(fā)中心。摩芯半導(dǎo)體擁有多項(xiàng)自主知識產(chǎn)權(quán),并成功通過了多項(xiàng)車規(guī)認(rèn)證。公司嚴(yán)格遵循ISO 26262 ASIL D功能安全流程體系和規(guī)范,致力于打造汽車“新四化”發(fā)展的底層支撐芯片,聚焦車規(guī)級實(shí)時處理器(RP,Real
[汽車電子]
Ceva 加入 Arm Total Design 加速開發(fā)面向基礎(chǔ)設(shè)施和非地面網(wǎng)絡(luò)衛(wèi)星的端到端 5G SoC
Ceva PentaG-RAN與Arm Neoverse計(jì)算子系統(tǒng)相結(jié)合,降低5G SoC開發(fā)成本并縮短上市時間,從而使雙方客戶受益 幫助智能邊緣設(shè)備更可靠、更高效地連接、感知和推斷數(shù)據(jù)的全球領(lǐng)先硅產(chǎn)品和軟件IP授權(quán)許可廠商 Ceva公司宣布加入Arm Total Design ,旨在加速開發(fā)基于Arm? Neoverse?計(jì)算子系統(tǒng)(CSS)和Ceva PentaG-RAN 5G平臺的端到端5G定制SoC,用于包括5G基站、Open RAN設(shè)備和5G非地面網(wǎng)絡(luò)(NTN)衛(wèi)星在內(nèi)的無線基礎(chǔ)設(shè)施。 Neoverse CSS 是經(jīng)過優(yōu)化、集成和驗(yàn)證的平臺,能夠以更低成本和更快上市時間實(shí)現(xiàn)定制硅片設(shè)計(jì)。 它與Ceva
[網(wǎng)絡(luò)通信]
Ceva 加入 <font color='red'>Arm</font> Total Design  加速開發(fā)面向基礎(chǔ)設(shè)施和非地面網(wǎng)絡(luò)衛(wèi)星的端到端 5G SoC
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved