當前位置:首頁 » 服務存儲 » 存儲指令stm
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

存儲指令stm

發布時間: 2022-09-04 19:23:17

① 匯編語言中的STM 指令是什麼意思

在TI公司DSP的匯編語言中,有STM 指令。
如:

STM #1234H, AR1

這句的意思是:向存儲器存放數據。

② 匯編語言 匯編指令中 stmfd ldmfd 什麼意思表示什麼邏輯運算一定採納

指令STMFD,LDMFD分析;

根據ATPCS規則,我們一般使用的FD(滿降序)類型的數據棧!常用指令,STMFD和LDMFD,

ARM的堆棧操作和批量載入/存儲指令的定址模式,你就可以知道地址的指令STMFD和LDMFD計算的方法:
BR />

STMFD指令的定址模式前降支(DB)

DB解決實際的內存地址:

start_address = RN - (Number_Of_Set_Bits_In( register_list)* 4)

結束點= RN - 4

STM指令操作的偽代碼如下:

如果ConditionPassed(條件)
>
地址start_address

對於i = 0?15

如果register_list [I] == 1

存儲器[地址]日

地址=地址+ 4

上述兩個偽代碼可以畫STMFD SP!

{R0-R7,LR}偽代碼如下:

SP = SP - 9×4;

= SP I = 0到7

內存[銷售地址] =日

地址=地址+ 4;

內存[銷售地址] = LR;

LDMFD指令後增量的方式定址模式(IA)的偽代碼的實際地址的內存IA

BR /> start_address = RN

結束點= RN +(Number_of_set_bits_in(register_list)* 4) - 4

LDM指令操作的偽代碼(不考慮PC寄存器):

如果ConditionPassed(條件),然後

地址= START_ADDRESS

I = 0到15

如果register_list [我] == 1

RI =內存地址,4]

地址=地址+ 4

因此LDMFD SP! ,{R0-R7,PC} ^(站點恢復,異常處理返回)的偽代碼如下:

= SP

i = 0到7 BR />
RI =內存地址,4]

地址=地址+ 4;

SP =地址;

③ ARM匯編可不可以將一個寄存器的值傳給一個標號所在地址 如果可以請問如何實現。

可以,用STR指令。如:STR R0,[R1] ;把寄存器R0里的值存儲到R1所指向地址單元。
還有一個批量存儲指令STM,如:STMIA R0, {R2-R5} ; 把R2到R5里的內容依次存儲到 R0、R0+4、R0+8、R0+12所指向的存儲單元。
關於這兩個指令及LDR和LDM的更多用法樓主大可用網路google一下。。。

④ 簡述thumb指令集較arm指令集有哪些限制

1 thumb指令集概述
為兼容數據匯流排寬度為16位的應用系統,ARM體系結構除了支持執行效率很高的32位ARM指令集以外,同時支持16位的Thumb指令集。
Thumb指令集是ARM指令集的一個子集,是針對代碼密度問題而提出的,它具有16位的代碼寬度。與等價的32位代碼相比較,Thumb指令集在保留32位代碼優勢的同時,大大的節省了系統的存儲空間。Thumb不是一個完整的體系結構,不能指望處理器只執行Thumb指令集而不支持ARM指令集。
當處理器在執行ARM程序段時,稱ARM處理器處於ARM工作狀態,當處理器在執行Thumb程序段時,稱ARM處理器處於Thumb工作狀態(CPSR的T=0:arm,T=1:thumb)。Thumb指令集並沒有改變ARM體系底層的編程模型,只是在該模型上增加了一些限制條件,只要遵循一定的調用規則,Thumb子程序和ARM子程序就可以互相調用。
與ARM指令集相比較,Thumb指令集中的數據處理指令的操作數仍然是32位,指令地址也為32位,但Thumb指令集為實現16位的指令長度,舍棄了ARM指令集的一些特性,相比之下從指令集上看thumb和arm主要有以下不同:
l 跳轉指令。條件跳轉在范圍上有更多的限制,轉向子程序只具有無條件轉移。
l 數據處理指令。對通用寄存器進行操作,操作結果需放入其中一個操作數寄存器,而不是第三個寄存器。
l 單寄存器載入和存儲指令。Thumb狀態下,單寄存器載入和存儲指令只能訪問寄存器R0~R7。
l 批量寄存器載入和存儲指令。LDM和STM指令可以將任何范圍為R0~R7的寄存器子集載入或存儲,PUSH和POP指令使用堆棧指針R13作為基址實現滿遞減堆棧,除R0~R7外,PUSH指令還可以存儲鏈接寄存器R14,並且POP指令可以載入程序指令PC。
Thumb指令集沒有包含進行異常處理時需要的一些指令,因此,在異常中斷時還是需要使用ARM指令。這種限制決定了Thumb指令不能單獨使用需要與ARM指令配合使用。
2 thumb寄存器和arm寄存器的關系

1)、Thumb 狀態寄存器集是ARM 狀態寄存器集的子集
程序員可直接訪問8 個通用寄存器R0~R7、PC、堆棧指針SP、鏈接寄存器LR和CPSR。每個特權模式都有分組的SP、LR和SPSR。
2)、Thumb狀態寄存器與ARM 狀態寄存器的關系
Thumb狀態寄存器與ARM狀態寄存器有如下關系:
l Thumb狀態R0~R7與ARM狀態R0~R7相同。
l Thumb狀態CPSR和SPSR與ARM狀態CPSR和SPSR 相同。
l Thumb狀態SP映射到ARM狀態R13。
l Thumb狀態LR映射到ARM狀態R14。
l Thumb狀態PC映射到ARM狀態PC(R15)。
3)、在Thumb狀態中訪問高寄存器
在Thumb狀態中高寄存器(寄存器R0~R7為低寄存器,寄存器R8~R15為高寄存器)不是標准寄存器集的一部分,匯編語言程序員對它們的訪問受到限制,但可以將它們用於快速暫存。
可以使用MOV指令的特殊變數將一個值從低寄存器R0~R7轉移到高寄存器R8~R15,或者從高寄存器到低寄存器。CMP指令可用於比較高寄存器和低寄存器的值。ADD 指令可用於將高寄存器的值與低寄存器的值相加。
---------------------------------------------------------------------------------------------------------------------------------

在編寫Thumb指令時,先要使用偽指令CODE16聲明,編寫ARM指令時,則可使用CODE32偽指令聲明。
1、Thumb指令集沒有協處理器指令、信號量指令、以及訪問CPSR或SPSR的指令,沒有乘加指令及64位乘法指令等,且指令的第二操作數受到限制;
2、大多數的Thumb數據處理指令採用2地址格式;
3、除了跳轉指令B有條件執行功能之外,其他指令均為無條件執行,而且分支指令的跳轉范圍有更多限制;
4、數據處理指令是對通用寄存器進行操作,在大多數情況下,操作的結果放入其中一個操作數寄存器中,而不是放入第3個寄存器中;訪問寄存器R8~R15受到一定的限制,除MOV、ADD指令訪問R8~R15外,其他數據處理指令總是更新CPSR中ALU狀態標志,訪問寄存器R8~R15的Thumb數據處理指令不能更新CPSR中的ALU狀態指示。
5、Thumb狀態下,單寄存器載入和存儲指令只能訪問寄存器R0~R7;
6、LDM、STM指令可以將任何范圍為R0~R7的寄存器子集載入或存儲;
7、PUSH、POP指令使用棧寄存器R13作為基址堆棧操作。
大多數ARM數據處理指令採用的是3地址格式(除了64位乘法指令外)。
所有異常都會使微處理器返回到ARM模式狀態,並在ARM的編程模式中處理。由於ARM微處理器字傳送地址必須可被4整除(即字對准),半字傳送地址必須可被2整除(即半字對准)。而Thumb指令是2個位元組長,而不是4個位元組,所以,由Thumb執行狀態進入異常時其自然偏移與ARM不同。
16位Thumb指令集是從32位ARM指令集提取指令格式的,每條Thumb指令有相同處理器模型所對應的32位ARM指令。
只要遵循ATPCS調用規則,Thumb子程序和ARM子程序就可以互相調用。

⑤ stm32f4 如何往外部存儲sram寫數據

STM32控制器晶元內部有一定大小的SRAM及FLASH作為內存和程序存儲空間,但當程序較大,內存和程序空間不足時,就需要在STM32晶元的外部擴展存儲器了。STM32F4系列晶元可以擴展外部SRAM用作內存。
__TM32晶元擴展內存與給PC擴展內存的原理是一樣的,只是PC上一般以內存條的形式擴展,而且內存條實質是由多個內存顆粒(即SDRAM晶元)組成的通用標准模塊,而STM32擴展時,直接與SRAM晶元連接。
_蔡婊媧⑵? SRAM的存儲單元以鎖存器來存儲數據。這種電路結構不需要定時刷新充電,就能保持狀態(當然,如果斷電了,數據還是會丟失的),所以這種存儲器被稱為「靜態(Static)」RAM。
_栽謔導視τ貿『現校_RAM 一般只用於 CPU 內部的高速緩存(Cache),而外部擴展的內存一般使用 DRAM。

⑥ Thumb的Thumb指令

從ARMv4T之後的ARM處理器有一種16-bit指令模式,叫做Thumb,也許跟每個條件式執行指令均耗用4位元的情形有關。
在Thumb模式下,較小的指令碼有更少的功能性。例如,只有分支可以是條件式的,且許多指令碼無法存取所有CPU的暫存器。然而,較短的指令碼提供整體更佳的編碼密度,即使有些運算需要更多的指令。特別在內存埠或匯流排寬度限制在32以下的情形時,更短的Thumb 指令碼能更有效地使用有限的內存帶寬,因而提供比32位元程式碼更佳的效能。典型的嵌入式硬體僅具有較小的32-bit datapath定址范圍以及其他更窄的16 bits定址。
Thumb指令在分支指令中一部分可以在ARM指令集之間切換,Thumb的數據處理指令都能映射到相應的
ARM數據處理指令中。但是單寄存器和多寄存器的載入和存儲指令是不能相互交換的。
最早應用Thumb 技術的處理器是 ARM7TDMI系列的內核。所有 ARM9 和後來的家族,包括 XScale 都納入了 Thumb 技術。
在編寫Thumb指令時,先要使用偽指令CODE16聲明,編寫ARM指令時,則可使用CODE32偽指令聲明。
1、Thumb指令集沒有協處理器指令、信號量指令、以及訪問CPSR或SPSR的指令,沒有乘加指令及64位乘法指令等,且指令的第二操作數受到限制
2、大多數的Thumb數據處理指令採用2地址格式;
3、除了跳轉指令B有條件執行功能之外,其他指令均為無條件執行,而且分支指令的跳轉范圍有更多限制;
4、數據處理指令是對通用寄存器進行操作,在大多數情況下,操作的結果放入其中一個操作數寄存器中,而不是放入第3個寄存器中;訪問寄存器R8~R15受到一定的限制,除MOV、ADD指令訪問R8~R15外,其他數據處理指令總是更新CPSR中ALU狀態標志,訪問寄存器R8~R15的Thumb數據處理指令不能更新CPSR中的ALU狀態指示。
5、Thumb狀態下,單寄存器載入和存儲指令只能訪問寄存器R0~R7;
6、LDM、STM指令可以將任何范圍為R0~R7的寄存器子集載入或存儲;
7、PUSH、POP指令使用棧寄存器R13作為基址堆棧操作。 1.分支指令:跳轉的范圍小,除B指令外,都是無條件跳轉.
2.數據處理指令:Thumb指令只有2個操作數,而ARM指令是3個操作數.
3.單寄存器載入存儲指令:Thumb指令只能訪問R0~R7.
4.多寄存器載入存儲指令:Thumb指令只能訪問R0~R7的子集.
5.Thumb特有指令:PUSH和POP作用於R13.

⑦ STM指令和LD指令有什麼區別

ARM指令集中,LDR通常都是作載入指令,但是它也可以作偽指令。
初學者一般不會注意到它們的區別,其實在嵌入式開發過程中,這兩條指令時非常常用的!我們應該了解他們的區別。
LDR偽指令的形式是「LDR Rn,=expr」。作用是裝在一個32bit常數和一個地址到寄存器。
下面舉一個例子來說明它的用法。
COUNT EQU 0x56000054
LDR R1,=COUNT
MOV R0,#0
STR R0,[R1]
COUNT是我們定義的一個變數,地址為0x56000054。
LDR R1,=COUNT 是將COUNT這個變數的地址,也就是0x56000054放到R1中。
MOV R0,#0是將立即數0放到R0中。
STR R0,[R1] 是一個典型的存儲指令,將R0中的值放到以R1中的值為地址的存儲單元去。
實際就是將0放到地址為0x56000054的存儲單元中去。
可見這三條指令是為了完成對變數COUNT賦值。
再舉一個例子
LDR R1,=COUNT ;這條偽指令,是將COUNT的地址賦給R1
LDR R0,[R1] ;將COUNT的值賦給R0
ARM是RISC結構,數據從內存到CPU之間的移動只能通過LDR/STR指令來完成。
比如想把數據從內存中某處讀取到寄存器中,只能使用ldr
比如:
ldr r0, 0x12345678 ;就是把0x12345678這個地址中的值存放到r0中。
而mov不能幹這個活,mov只能在寄存器之間移動數據,或者把立即數移動到寄存器中,這個和x86這種CISC架構的晶元區別最大的地方。
x86中沒有ldr這種指令,因為x86的mov指令可以將數據從內存中移動到寄存器中。
MOV是從一個寄存器或者移位的寄存器或者立即數的值傳遞到另外一個寄存器。
從本質上是寄存器到寄存器的傳遞,為什麼會有立即數,其實也是有限制的立即數,不是所有立即數都可以傳遞的
這個立即數要符合一個8位數循環右移偶數位的取值。
原因是,MOV本身就是一條32bit指令,除了指令碼本身,它不可能再帶一個可以表示32bit的數字,所以用了其中的12bit來表示立即數,其中4bit表示移位的位數(循環右移,且數值x2),8bit用來表示要移位的一個基數。
另外還有一個就是ldr偽指令,雖然ldr偽指令和ARM的ldr指令很像,但是作用不太一樣。ldr偽指令可以在立即數前加上=,以表示把一個地址寫到某寄存器中,比如:
ldr r0, =0x12345678
這樣,就把0x12345678這個地址寫到r0中了。所以,ldr偽指令和mov是比較相似的。只不過mov指令限制了立即數的長度為8位,也就是不能超過512。而ldr偽指令沒有這個限制。如果使用ldr偽指令時,後面跟的立即數沒有超過8位,那麼在實際匯編的時候該ldr偽指令是被轉換為 mov指令的。

⑧ 求解這道嵌入式題

STMIB R4!,{R5,R6,R7}
STM為批量存儲數據指令,後面的IB: 每次傳送前地址加4;所以R5,R6,R7中的內容是不改變的。現在來看!號,這個表示是否更新寄存器R4。所以每傳送一次之前R4就+4;PC是不變的,不要將PC與SP的功能混淆。
LDMIA R4!,{R5,R6,R7}

有了上面的理解,這個就簡單了。原理是一樣的,LDMIA R4!,IA表示每次傳送後地址加4;由於從地址0x6000開始地址裡面存儲的數據沒告訴,所以R5,R6,R7的值是不確定的。R4沒次傳送後+4;PC的值現在不好確定,如果這句匯編是與上一句的下一句,怎+4;如果只是單獨理解,也不變。

注意,以上都是針對ARM狀態來說的,如果是thumb狀態,改為+2!
可以調試一下看看,是不是這樣。