常用的匯編指令與技巧(收藏)
1.數(shù)據(jù)傳送指令:mov
move r1,r2 /*r1=r2*/
move r1,#4096 /*r1=4096*/
2.大范圍的地址讀取指令:ldr
ldr r1,=0x123456789 /*r1=0x123456789*/
ldr r1,=label /*獲取絕對(duì)地址,即label的地址*/
label:
……
3.內(nèi)存訪問(wèn)指令(當(dāng)ldr后面沒(méi)有=號(hào)時(shí)為內(nèi)存讀取指令)
讀取指令:ldr
ldr r1 ,[r2,#4] /*將內(nèi)存地址為r2+4的數(shù)據(jù)讀取到r1中,相當(dāng)于C語(yǔ)言中的*操作*/
ldr r1,[r2],#4 /*將內(nèi)存地址為r2的數(shù)據(jù)讀取到r1中,再將地址加4,r2=r2+4*/
ldr pc,_irq /*pc=*(_irq)將標(biāo)號(hào)中的內(nèi)容放入pc中
_irq:
.word do_swi
存儲(chǔ)指令:str
str r1 ,[r2,#4] /*將r1的值存入地址為r2+4的內(nèi)存中*/
str r1,[r2],#4 /*將r1的值存入地址為r2的內(nèi)存中,再將地址加4,r2=r2+4*/
4.批量?jī)?nèi)存訪問(wèn)指令ldm,stm
格式:ldm {cond} <addresing_mode> <rn> {!} <register list> {^}
stm{cond} <addresing_mode> <rn> {!} <register list> {^}
格式說(shuō)明:
1){cond}:表示指令的執(zhí)行條件,根據(jù)cpsr寄存器中的條件標(biāo)志位決定是否執(zhí)行該條指令,每條ARM指令包含4bit的條件碼域,
可以定義16個(gè)執(zhí)行條件,具體如下表:
2)<addresing_mode>表示地址變化模式,具體如下:
3)<rn> 中保存內(nèi)存的地址,如果后面加上!,指令執(zhí)行完成后,rn的值會(huì)更新,等于下一個(gè)內(nèi)存的地址,否則保持初始值。
4)<register list>表示寄存器列表,對(duì)于ldm指令,從<rn>所對(duì)應(yīng)的內(nèi)存塊中讀取數(shù)據(jù)寫(xiě)入這些寄存器,對(duì)于stm把這些寄存器的值寫(xiě)入
<rn>對(duì)應(yīng)的內(nèi)存塊中。如果寄存器地址連續(xù),可以寫(xiě)成r1-rx的格式,不連續(xù)的用逗號(hào)隔開(kāi)。^符號(hào)有兩種含義:如果<register list>有pc寄存器,
它表示指令執(zhí)行后,spsr寄存中的值將自動(dòng)復(fù)制到cpsr寄存器中--這通常用于中斷處理函數(shù)的返回;如果沒(méi)有pc寄存器,那^表示操作的是
用戶模式下的寄存器,而不是當(dāng)前特權(quán)模式下的寄存器。
5)指令中<register list>與<rn>的對(duì)應(yīng)關(guān)系為:編號(hào)低的寄存器對(duì)應(yīng)內(nèi)存中低地址單元,編號(hào)高的寄存器對(duì)應(yīng)內(nèi)存中高地址單元,具體如下:
擴(kuò)展:
ldmfd
stmfd
5.算術(shù)指令
加指令:add
add r1,r2,#1 /*r1=r2+1*/
減指令:sub
sub r1,r2,#1 /*r1=r2-1*/
乘指令:mul
mul r1,r2,#4 /*r1=r2*4*/
6.程序狀態(tài)寄存器的訪問(wèn)指令
msr cpsr, r0 /* s<-r,r0的值復(fù)制到cpsr中*/
mrs r0,cpsr /*r<-s,將cpsr的值復(fù)制到r0中*/
7.相對(duì)跳轉(zhuǎn)指令b,bl
1)這兩條指令的區(qū)別在于bl除了跳轉(zhuǎn)以外,還將返回地址(bl的下一條指令地址)保存在lr寄存器中
2)這兩條指令的跳轉(zhuǎn)范圍是當(dāng)前指令前后32M范圍內(nèi)
3)他們是位置無(wú)關(guān)的指令,相對(duì)跳轉(zhuǎn)
e.g:
b fun1
fun1:
bl fun2
fun2:
..............
擴(kuò)展:絕對(duì)跳轉(zhuǎn) ldr pc,=xxx
直接將要執(zhí)行的指令地址存入pc中,pc為程序計(jì)數(shù)器,指向當(dāng)前指向位置
8.其他指令
比較指令:cmp
cmp r1,r2 /*根據(jù)對(duì)比的結(jié)果設(shè)置cpsr寄存器的標(biāo)志位,參考ARM指令條件碼表
邏輯指令
位與:and(相當(dāng)于&)
and r0,r1,#0xff /*r0=r1&0xff*/
位或:orr(相當(dāng)于|)
orr r0,r1,#0xff /*r0=r1|0xff*/
清零:bic
bic r0,r0,#0x03 /*將r0中的第一位和第二位清零*/
測(cè)試:tst
tst r0,#0x20 /*測(cè)試第六位是否為0,為0則將cpsr的Z位置1*/
總結(jié)
以上所述是小編給大家介紹的常用的匯編指令與技巧,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
匯編語(yǔ)言功能字符串大小寫(xiě)轉(zhuǎn)換實(shí)現(xiàn)實(shí)例詳解
這篇文章主要為大家介紹了匯編語(yǔ)言功能大小寫(xiě)轉(zhuǎn)換實(shí)現(xiàn)的實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11匯編語(yǔ)言實(shí)現(xiàn)在指定字符串中搜索字符''A''的方法
這篇文章主要介紹了匯編語(yǔ)言實(shí)現(xiàn)在指定字符串中搜索字符'A'的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02匯編語(yǔ)言教程文件后綴大小寫(xiě)S區(qū)別分析詳解
這篇文章主要為大家介紹了匯編文件后綴.s與.S區(qū)別分析詳解,文中詳細(xì)的講解了大寫(xiě)的S與小寫(xiě)的s后綴在匯編語(yǔ)言中的作用區(qū)別,有需要的朋友可以借鑒參考下2021-11-11匯編語(yǔ)言基礎(chǔ)理解計(jì)算機(jī)底層技術(shù)原理
這篇文章主要為大家介紹了匯編語(yǔ)言基礎(chǔ),理解計(jì)算機(jī)底層原理,想要成為高級(jí)程序員,我們必須要學(xué)會(huì)匯編語(yǔ)言,匯編語(yǔ)言是非常重要的計(jì)算機(jī)底層技術(shù),一般用于底層的編寫(xiě)2021-11-11匯編語(yǔ)言學(xué)習(xí)assume的作用詳解
這篇文章主要為大家介紹了匯編語(yǔ)言學(xué)習(xí)assume的作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11匯編語(yǔ)言MUL指令無(wú)符號(hào)數(shù)乘法的使用
這篇文章主要介紹了匯編語(yǔ)言MUL指令無(wú)符號(hào)數(shù)乘法的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02