理解LDM和STM多暫存器定址 堆疊指標sp例子

2021-06-11 05:40:36 字數 2665 閱讀 8525

堆疊定址的命令ldmfa/stmfa

、ldmea/stmea

、ldmfd/stmfd

、ldmed/stmed。

ldm和

stm表示多暫存器定址,即一次可以傳送多個暫存器值。

ldm:一次裝載多個,這裡用來出棧。(另有,ldr暫存器間接定址 也是裝載r2內容作指標指向的記憶體到r1,如:ldrr1,[r2] )

stm:一次儲存多個,這裡用來入棧。(另有,str暫存器間接定址 也是把r1寫入到r2內容作指標指向的記憶體,如:ldr

r1,[r2] 

)f/e表示指標指向的位置 f:

full

滿堆疊,表示堆疊指標指向最後乙個入棧的有效資料項。 e:

empty

a/d表示堆疊的生長方式

fd、ed、

fa和ea指定是滿棧還是空棧,是公升序棧還是降序棧,用於堆疊定址。

乙個滿棧的棧指標指向上次寫的最後乙個資料單元. 

空棧的棧指標指向第乙個空閒單元。

乙個降序棧是在記憶體中反向增長而公升序棧在記憶體中正向增長。 :當

regs

中不包含

pc時,該字尾用於指示指令所用的暫存器為使用者模式下的暫存器,

否則指示指令執行時,將暫存器spsr

的值複製到

cpsr中。

例:area example,code,readonly

entry     

export start

export loop

export over                   

start       

mov r4,#4

mov r5,#5

mov r6,#6

add r0,sp,#0

stmfa sp!,   ; 1:stmfa,2: stmfd,3: stmea,4: stmed

add r1,sp,#0

b loop

loop

b loop     

over    

end  

記憶體中的表示:

假設sp指向0x00000000位址

1: stmfa

sp!, 

0    1  2   3       4    5    6    7      8   9    a   b     c   d    e    f

0x0000 0000  10 00 ff e7   04 00 00 00     05 00 00 00   06 00 00 00

a:向高位址+1

sp:0x0000 000c

2: stmfd

sp!, 

0    1  2   3       4    5    6    7      8   9    a   b     c   d    e    f

0xffff fff0  10 00 ff e7   04 00 00 00     05 00 00 00    06 00 00 00

d:向低位址+1

sp:0xffff fff4

3: stmea

sp!, 

0    1  2   3       4    5    6    7      8   9    a   b     c    d    e    f

0x0000 0000  04 00 00 00     05 00 00 00    06 00 00 00 

00  e8 00 e8

a:向高位址+1

sp:0x0000 000c

4:  stmed

sp!, 

0    1  2   3       4    5    6    7      8   9    a   b      c   d    e    f

0xffff fff0  10 00 ff e7   00  e8 00 e8   04 00 00 00     05 00 00 00    

0x0000 0000   06 00 00 00 

00  e8 00 e8   10 00 ff e7    00  e8 00 e8  

d:向低位址+1

sp:0xffff fff4

又如:stmed sp!,

mov r2,#2

stmed sp!,

0    1  2   3       4    5    6    7      8   9    a   b      c   d    e    f

0xffff fff0  10 00 ff e7   02  00 00 00  

04 00 00 00     05 00 00 00    

0x0000 0000   06 00 00 00 

00  e8 00 e8   10 00 ff e7    00  e8 00 e8  

d:向低位址+1

sp:0xffff fff0

ldmed sp!,

r7:0x02    (正確)

r8:0x04   (正確)

ldmfd sp!,

r7:0xe7ff0001  (不是想要的結果。)

r8:0x02  (不是想要的結果。)

所以,壓入堆疊,用的ed引數。彈出堆疊也要用回ed ,不能用fd.更不能用fa.訪問到的記憶體是不是想要的。

多暫存器定址指令ldmia ldmib

多暫存器和堆疊定址的用法 多暫存器定址 ldmia,ldmib,stmia,stmib,ldmda,ldmdb,s a,s b 堆疊定址 ldmfa,ldmfd,stmfa,stmfd,ldmea,ldmed,stmea,stmed fd 滿遞減堆疊 ed 空遞減堆疊 fa 滿遞增堆疊 ea 空遞增...

多暫存器和堆疊定址的用法

多暫存器定址 ldmia,ldmib,stmia,stmib,ldmda,ldmdb,s a,s b 堆疊定址 ldmfa,ldmfd,stmfa,stmfd,ldmea,ldmed,stmea,stmed ldm批量載入 stm批量儲存指令可以實現一組暫存器和一塊連續的記憶體單元之間傳輸資料。允許...

十四 暫存器和定址

1.暫存器分類 2.一共37個暫存器,31個通用暫存器,6個狀態暫存器 其中usr和sys的暫存器很類似 3.通用暫存器 1 不分組暫存器0 7 2 分組暫存器 8 14 3 pc指標 r15 4狀態暫存器 只有在異常模式下,才會既有cpsr又有spsr,usr和sys模式下只有cpsr,為的是保護...