ARM MOV和 LDR指令關系

ARM是RISC結構,數據從內存到CPU之間的移動只能通過L/S指令來完成,也就是ldr/str指令。
比如想把數據從內存中某處讀取到寄存器中,只能使用ldr
比如:
ldr r0, 0x12345678
就是把0x12345678這個地址中的值存放到r0中。
而mov不能干這個活,mov只能在寄存器之間移動數據,或者把立即數移動到寄存器中,這個和x86這種CISC架構的芯片區別最大的地方。
x86中沒有ldr這種指令,因為x86的mov指令可以將數據從內存中移動到寄存器中。

另外還有一個就是ldr偽指令,雖然ldr偽指令和ARM的ldr指令很像,但是作用不太一樣。ldr偽指令可以在立即數前加上=,以表示把一個地址寫到某寄存器中,比如:
ldr r0, =0x12345678
這樣,就把0x12345678這個地址寫到r0中了。所以,ldr偽指令和mov是比較相似的。只不過mov指令限制了立即數的長度為8位,也就是不能超過512。而ldr偽指令沒有這個限制。如果使用ldr偽指令時,后面跟的立即數沒有超過8位,那么在實際匯編的時候該ldr偽指令是被轉換為mov指令的。

ldr偽指令和ldr指令不是一個同東西。

1.匯編器所做的工作:
?? 如果LDR Rd, =const能夠被轉換成MOV 或者 MVN指令,則匯編器將轉換成它成為相應的指令;
?? 如果不能被轉換,則匯編器會將value存放在在一個叫做literal pool(一段嵌在代碼中用以存儲constant values的內存空間),并且產生一個LDR指令操作,它是

Program-relative address的,并且是從literal pool來讀這個constant value的。
?? 例如:
?? LDR R1,=23?? ;MOV R1, #23
?? LDR Rn, [pc, #offset to liteal pool]?? ;從內存單元pc+offset處裝載數據到Rn。

2.offset與pc之間的偏移量還有一定的規定:
?? 在arm狀態為<4KB,并且是雙向的。
?? 在thumb狀態為<1KB,并且只能向前(Forward)。??
3.設置literal pools
?? 以LTORG偽指令來標識。LTORG偽指令通常放在無條件跳轉指令之后,或者子程序返回指令之后,這樣處理器就不會錯誤的將文字池中的數據當作指令來執行了。
4.例程:
AREA?? Loadcon, CODE, READONLY
???
??? ENTRY;標識第一條指令執行的地方。

start
??? BL func1
??? ; Branch to first subroutine
??? BL func2??? ; Branch to second subroutine

stop??? ???
??? MOV r0
, #0x18
??? LDR r1, =0x20026;?? ??? ???
??? SWI 0x123456??? ;ARM semihosting SWI

func1
??? LDR r0, =42
??? ; 可以轉換成MOV格式=> MOV R0, #42
??? LDR r1, =0x55555555??? ;不能轉換,因為超過了MOV操作數的范圍,故用literal pool => LDR R1, [PC,#offset to Literal Pool 1]
LDR r2, =0xFFFFFFFF??? ;可以轉換成MVN =>MVN R2, #0???
??? MOV pc, lr??? ??? ;返回到調用該函數的下一條,一般情況下將LTORG的聲明放在此語句之后。
?????? ??? LTORG??? ;Literal Pool 1 contains;此處是存放LDR中constant values的一個embedded memory in code section!
??? ??? ??? ??? ??? ;針對此示例存放的內容為:literal Ox55555555
func2
??? LDR r3, =0x55555555
??? ; => 不能夠被轉換,故使用literal pool,由于0x55555555已經存在literal pool1,故可以使用literal pool1中的literal data,轉換成此

種形式=> LDR R3, [PC, #offset to Literal Pool 1]
??? ;LDR r4, =0x66666666??? ;If this is uncommented it fails, because Literal Pool2 is out of reach因為0x66666666未出現,所以這個需要存放在此代碼后面的

literal pool2中,由于在后面分配了一塊4200大小的內存塊,這樣與literal pool2之間的offset>4KB.若不注釋掉此句話,則編譯器會提示出現錯誤。
??? MOV pc, lr??? ;返回到調用該函數的下一條,

LargeTable
??? SPACE 4200
??? ;Starting at the current location, clears a 4200 byte area of memory to zero
??????? END??? ;Literal Pool 2 is empty,由于沒有顯示聲明literal pool2,故這是literal pool2的默認聲明位置(程序的結束位置)




關于LTORG:

LTORG用于聲明一個文字池,在使用LDR偽指令的時候,要在適當的地址加入LTORG聲明文字池,這樣就會把要加載的數據保存在文字池內,再用ARM的加載指令讀出數據。(若沒有

使用LTORG聲明文字池,則匯編器會在程序末尾自動聲明)。
偽指令格式為:
??? LTORG
偽指令應用舉例如下:
??? ;..............
??? LDR R0, =0X12345678
??? ADD R1, R1, R0
??? MOV PC, LR
??? LTORG??? ;聲明文字池,此地址存儲0x12345678

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455621.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455621.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455621.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

day2 操作系統

一.為何要有操作系統 程序員無法把所有的硬件操作細節都了解到&#xff0c;管理這些硬件并且加以優化使用是非常繁瑣的工作&#xff0c;這個繁瑣的工作就是操作系統來干的&#xff0c;有了他&#xff0c;程序員就從這些繁瑣的工作中解脫了出來&#xff0c;只需要考慮自己的應用…

Django之model模型

模型 1.如何安裝pymysql 1.file->settings->Project Interpreter 2.點擊右邊的"" 3.搜索pymysql 4.點擊最下面的"install package" 5.安裝成功會提示"Package "pymysql" install successfully"2.如何在django中配置mysql 1.在…

python安裝不了jupyter_python學習筆記——Windowns下Python3之安裝jupyter

Windowns下Python3之安裝jupyter Jupyter notebook&#xff1a; 一個交互式筆記本&#xff0c;支持運行40多種編程語言。 利用它來寫Python&#xff0c;代碼和運行結果都可以保存下載&#xff0c;十分方便。本文主要以自身的安裝過程為例&#xff0c;結合遇到的問題&#xff0c…

Java文件讀寫操作

http://blog.csdn.net/jiangxinyu/article/details/7885518/ 比較齊全&#xff0c;有多種文件讀寫操作轉載于:https://www.cnblogs.com/maowuyu-xb/p/7238170.html

視頻編碼與封裝方式詳解

1. 編碼方式和封裝格式... 1 2. 視頻編碼標準兩大系統... 2 MPEG-1. 2 MPEG-2. 3 MPEG-3. 3 MPEG-4. 3 ITU-T. 4 WMV. 4 3. 常用視頻編碼方式有Xvid( 4 4. 常見存儲封裝格式... 6 5. 幾種常見的轉換格式設置... 7 6. 無損視頻編碼... 9 1. 編碼方式和封裝格式常見…

Binder

問&#xff1a;為什么Android要采用Binder作為IPC機制 答案來自百度知道&#xff1a; &#xff08;1&#xff09;從性能的角度數據拷貝次數&#xff1a;Binder數據拷貝只需要一次&#xff0c;而管道、消息隊列、Socket都需要2次&#xff0c;但共享內存方式一次內存拷貝都不需要…

matlab 三維核密度圖_Matlab精彩畫圖示例:三維網狀圖和三維曲面圖

接上篇&#xff1a;Matlab精彩畫圖示例&#xff1a;繪制圖上圖這篇介紹兩個繪制三維圖的命令&#xff1a;mesh - 繪制三維網狀圖surf - 繪制三維曲面圖matlab代碼如下&#xff1a;繪制三維圖的matlab代碼示例程序運行結果如下&#xff1a;mesh(X,Y,Z) draws a wireframe mesh w…

Django之templates模板

模板的使用 1.如何使用模板 在manage.py的同級文件夾中創建templates在setting.py的文件中把第58行DIRS: [ ],改成DIRS: [os.path.join(BASE_DIR,templates)], 知識點: os.path.join(BASE_DIR,templates) 拼接兩個字符串 BASE_DIR找到項目根目錄127.0.0.1:8000/myadmin/templ…

STL容器刪除元素的陷阱

今天看Scott Meyers大師的stl的用法&#xff0c;看到了我前段時間犯的一個錯誤&#xff0c;發現我寫的代碼和他提到錯誤代碼幾乎一模一樣&#xff0c;有關stl容器刪除元素的問題&#xff0c;錯誤的代碼如下&#xff1a;std::vector<struct> mFriendList;...std::vector&l…

JDBC1

1.jdbc的概述 是sun公司統一提供的一套接口規范,各個數據庫生產商提供實現 注冊驅動,獲得連接,獲得執行的SQL語句對象,釋放資源 package com.learn.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;import org.junit.Test;publ…

無符號哥倫布指數編碼

在H264編解碼中&#xff0c;哥倫布指數編碼是經常用到的&#xff0c;下面是無符號哥倫布指數編碼的C代碼&#xff1a; static inline int bs_read_ue( bs_t *s ){ int i 0; while( bs_read1( s ) 0 && s->p < s->p_end && i < 32 ) { …

django后臺多頁面分頁邏輯python代碼

#!/usr/bin/env python # -*- coding:utf-8 -*- # Created by 秋葉夏風# 本模塊的功能:<>def get_page_list(max_page,curr_page,leng):用于生成頁數列表:param max_page:最大頁數:param curr_page:當前頁數:param leng:分頁步長:return:list# max_page 20# curr_page …

python程序怎么保存到u盤_python實現usb自動拷貝程序的方法

python實現usb自動拷貝程序的方法 發布時間&#xff1a;2020-06-28 09:07:05 來源&#xff1a;億速云 閱讀&#xff1a;135 作者&#xff1a;清晨 這篇文章將為大家詳細講解有關python實現usb自動拷貝程序的方法&#xff0c;小編覺得挺實用的&#xff0c;因此分享給大家做個參考…

young people can also be a leader

2019獨角獸企業重金招聘Python工程師標準>>> The leaders or directors of organizations are often older people. But some people say that young people can also be a leader. To what extent do you agree or disagree? In my view , young people can also …

BZOJ 2004 公交線路(狀壓DP+矩陣快速冪)

注意到每個路線相鄰車站的距離不超過K&#xff0c;也就是說我們可以對連續K個車站的狀態進行狀壓。 然后狀壓DP一下&#xff0c;用矩陣快速冪加速運算即可。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm>#define…

python爬取網易云歌單_詳解python selenium 爬取網易云音樂歌單名

目標網站&#xff1a;首先獲取第一頁的數據&#xff0c;這里關鍵要切換到iframe里打印一下獲取剩下的頁數&#xff0c;這里在點擊下一頁之前需要設置一個延遲&#xff0c;不然會報錯。結果&#xff1a;一共37頁&#xff0c;爬取完畢后關閉瀏覽器 完整代碼&#xff1a; url htt…

Idea的一些調試技巧及設置todo

程序員的工作內容&#xff0c;除了大部分時間寫代碼之外&#xff0c;因為有不少的時間是用在調試代碼上。甚至說不是在調試代碼&#xff0c;就是即將調試代碼。 :) 今天我們來談談調試代碼的一些技巧&#xff0c;在使用IDE提供的debugger時一些快速定位問題的方式。 看到這里的…

安裝Node.js和npm

安裝Node.js和npm 學習了&#xff1a;http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00143450141843488beddae2a1044cab5acb5125baf0882000 轉載于:https://www.cnblogs.com/stono/p/6891242.html

c++ cstring 轉換 char_cstring.h庫常用函數

上周&#xff0c;老師講了大整數的運算方法&#xff0c;我對大數的存儲和運算還有些不理解&#xff0c;仔細思考了一下&#xff0c;其實還是訓練孩子對機器存儲數據的各種掌握和運用吧。不多想&#xff0c;先期孩子雖然一直學習&#xff0c;但是缺乏對知識的系統整理&#xff0…

Django后臺管理之商品分類

商品分類 1.建表字段 1.pid&#xff1a;用來綁定父類的 2.path&#xff1a;用來拼接id&#xff0c;保證查詢出的數據是按照層級關系展示的2.concat 把表中的兩個字段拼接成一個新的字段&#xff0c;通過as重新命名3.查詢語句 1.按照第二步拼接成新的字段的名字進行排序查詢…