安徽網(wǎng)站建設價格寧波關鍵詞排名優(yōu)化
【內(nèi)存讀寫指令】
int *p=0X12345678
*p=100;//向內(nèi)存中寫入數(shù)據(jù)
int a= *p;//從內(nèi)存讀取
1.單寄存器內(nèi)存讀寫指令
1.1 指令碼以及功能
向內(nèi)存中寫:
str:向內(nèi)存中寫一個字(4字節(jié))的數(shù)據(jù)
strh:向內(nèi)存寫半個字(2字節(jié))的數(shù)據(jù)
strb:向內(nèi)存寫一個字節(jié)的數(shù)據(jù)
從內(nèi)存讀:
ldr:從內(nèi)存讀取一個字的數(shù)據(jù)
ldrh:從內(nèi)存讀取半個字的數(shù)據(jù)
ldrb:從內(nèi)存讀取一個字節(jié)的數(shù)據(jù)
1.2 格式
指令碼{條件碼} 目標寄存器 [目標地址]
str 目標寄存器 ,[目標地址]:將目標寄存器的數(shù)據(jù)寫入到以目標地址為起始的內(nèi)存中
ldr 目標寄存器 ,[目標地址]:從以目標地址為起始的內(nèi)存中讀一個字的數(shù)據(jù)到目標寄存器
1.3 示例
mov r1,#0XFFFFFFFFldr r2,=0X40000000@向內(nèi)存寫入str r1,[r2]@從內(nèi)存讀ldr r3,[r2]
1.4 單寄存器讀寫的地址索引方式
1.前索引mov r1,#0XFFFFFFFFldr r2,=0X40000000str r1,[r2,#8]@將r1寄存器的值保存到r2+8為起始地址的內(nèi)存中l(wèi)dr r3,[r2,#8]@從r2+8為起始地址的內(nèi)存中讀2.后索引mov r1,#0XFFFFFFFFldr r2,=0X40000000str r1,[r2],#8 @將r1寄存器的值保存到r2為起始地址的內(nèi)存中,r2值=讓r2+83.自動索引mov r1,#0XFFFFFFFFldr r2,=0X40000000str r1,[r2,#8]! @將r1寄存器的值保存到r2+8為起始地址的內(nèi)存中,r2=r2+8
2.批量寄存器的內(nèi)存讀寫方式
2.1 指令碼以及格式
向內(nèi)存寫:stm 目標地址,{寄存器列表}將寄存器列表中每一個寄存器的值都寫道目標地址指向的連續(xù)空間之中
從內(nèi)存讀ldm 目標地址,{寄存器列表}將目標地址指向的連續(xù)內(nèi)存中的數(shù)據(jù)讀到寄存器列表中的寄存器中注意事項:1.如果寄存器列表中寄存器的編號連續(xù),可以用-表示列表,如果不連續(xù),用,分割寄存器{r1-r5,r7}2.無論寄存器列表中如何表示,我們在讀寫內(nèi)存的時候始終是低地址 對應低寄存器編號
2.2 示例代碼
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stm r6,{r1,r2,r3,r4,r5} @將r1-r6寄存器的值寫道r6指向的連續(xù)內(nèi)存中l(wèi)dm r6,{r7,r8,r9,r10,r11}@從r6指向的連續(xù)內(nèi)存中讀取數(shù)據(jù)保存到r7-r11寄存器中
2.3 批量寄存器的地址增長方式
每次向指定寄存器保存的地址中寫入一個數(shù)據(jù),保存地址的寄存器保存的地址也會發(fā)生相應的改變
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stm r6!,{r1-r5}先向r6指向的內(nèi)存中寫一個數(shù)據(jù),然后r6保存的地址向地址大的方向增長
ia后綴
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stmia r6!,{r1-r5}先向r6指向的內(nèi)存中寫一個數(shù)據(jù),然后r6保存的地址向地址大的方向增長
ib后綴
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stmib r6!,{r1-r5}先讓R6寄存器保存的地址往地址大的方向增長,再向R6寄存器保存的地址中寫入數(shù)據(jù)
da后綴
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000800stmda r6!,{r1-r5}先向R6指向的內(nèi)存中存數(shù)據(jù),然后R6寄存器保存的地址往地址小的方向增長
dB后綴
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000800stmdb r6!,{r1-r5}先將R6寄存器保存的地址往地址小的方向增長,再往R6寄存器保存的地址內(nèi)存中存入數(shù)據(jù)
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stmia r6!,{r1-r5} @ia存,db取ldmdb r6!,{r7-r11}
3.棧內(nèi)存讀寫
棧指針寄存器:R13/SP
棧:棧本質(zhì)上就是一段內(nèi)存,我們在內(nèi)存中指定一片區(qū)域用于保存一些臨時數(shù)據(jù),這片區(qū)域就是棧區(qū)
3.1 棧的類型
增棧:壓棧結束后,棧頂往地址大的方向增長
減棧:壓棧結束后,棧頂往地址小的方向增長
空棧:壓棧結束后,棧頂區(qū)域沒有有效數(shù)據(jù)
滿棧:壓棧結束后,棧頂區(qū)域存放有效數(shù)據(jù)空增棧(EA)/空減棧(ED)/滿增棧(FA)/滿減棧(FD)
ARM使用的棧是滿減棧
3.2 滿減棧壓棧出棧操作
ex1:ldr sp,=0X40000020 @指定頂?shù)刂穖ov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5push {r1-r5} @壓棧pop {r6-r10} @將棧頂元素數(shù)值出棧
ex2:ldr sp,=0X40000020 @指定頂?shù)刂穖ov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5STMDB sp!,{r1-r5} @壓棧LDMIA sp!,{r6-r10} @將棧頂元素數(shù)值出棧
EX3:ldr sp,=0X40000020 @指定頂?shù)刂穖ov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5STMfd sp!,{r1-r5} @壓棧LDMfd sp!,{r6-r10} @出棧
4.棧實例---葉子函數(shù)的調(diào)用過程
.text
.global _start _start:ldr sp,=0X40000020 @初始化棧b main
main:mov r1,#1mov r2,#2bl funcadd r3,r1,r2b mainfunc:
@壓棧保護現(xiàn)場stmfd sp!,{r1,r2}mov r1,#3mov r2,#4sub r4,r2,r1@出?;謴同F(xiàn)場ldmfd sp!,{r1,r2}mov pc,lr @返回main函數(shù)wh: b wh .end
5.棧實例---非葉子函數(shù)的調(diào)用過程
.text
.global _start _start:ldr sp,=0X40000020 @初始化棧b main
main:mov r1,#1mov r2,#2bl funcadd r3,r1,r2b mainfunc:
@壓棧保護現(xiàn)場stmfd sp!,{r1,r2,lr}mov r1,#3mov r2,#4bl fun1sub r4,r2,r1@出?;謴同F(xiàn)場ldmfd sp!,{r1,r2,lr}mov pc,lr @返回main函數(shù)
fun1:
@壓棧保護現(xiàn)場stmfd sp!,{r1,r2}mov r1,#4mov r2,#5mul r5,r1,r2@出棧恢復現(xiàn)場ldmfd sp!,{r1,r2}mov pc,lrwh: b wh .end