ARM匯編編程基礎(chǔ)之三-基本尋址方式與基本指令
首先,來看一看我們已經(jīng)見過的2條指令:MOV pc, lr; BL addsub
本文引用地址:http://m.butianyuan.cn/article/201611/322182.htm最簡(jiǎn)單的匯編指令格式是操作碼(例如:MOV、BL)和操作數(shù)(例如:pc, lr, addsub)。操作碼易于理解,例如MOV表示將某個(gè)值從一處傳送到另一處,BL表示跳轉(zhuǎn)到某處;而操作數(shù)則表示一處和另一處到底是哪里(是在寄存器中還是內(nèi)存中),要跳轉(zhuǎn)的位置在哪里(或者是絕對(duì)地址或者是相對(duì)地址)。
操作數(shù)部分要解決的問題是:到哪里去獲得操作數(shù)?因此就有了尋址方式的分類?;旧蟻碇v,ARM共有8種尋址方式,本文我們了解其中最基本的3種尋址方式:寄存器尋址、立即數(shù)尋址、寄存器間接尋址。
1、寄存器尋址
MOV pc, lr 表示操作數(shù)來源于寄存器(pc和lr)。這種尋址方式,在指令的32位機(jī)器碼中的地址碼部分,存放的是寄存器(pc和lr)的編號(hào),故稱之為寄存器尋址。
2、立即數(shù)尋址
MOV pc, #64 表示將常數(shù)64放入寄存器pc,其中常數(shù)64被稱為立即數(shù)。立即數(shù)尋址指令中的地址碼部分就是操作數(shù)本身,也就是說,數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了可以立即使用的操作數(shù)(故稱為立即數(shù))。
這里,可能大家會(huì)看出一個(gè)問題:由于立即數(shù)是位于32位機(jī)器碼中的,而32位機(jī)器碼中除了操作數(shù)外還有操作碼,這就意味著不可能用全部32bit來表示立即數(shù)。事實(shí)上,ARM機(jī)器指令中,僅用了最低的12bit來表示立即數(shù)。那么我們自然推論立即數(shù)的范圍是-2048——2047,這意味著MOV pc, #8192這樣的指令是非法的。但事實(shí)情況并非如此,MOV pc,#8192是合法且能正常運(yùn)行的。真實(shí)情況是,ARM機(jī)器指令可以表示的立即數(shù)范圍是-2^31--2^31-1,只不過它只能表示這其中的2^12個(gè)數(shù)而已。ARM是這樣用12bit來表示1個(gè)立即數(shù)的:將12bit劃分為2部分——高4位和低8位,將低8位補(bǔ)0擴(kuò)展為32位,然后循環(huán)右移X位(X = 高4位表示的無符號(hào)整數(shù)*2),例如:如果32位機(jī)器碼中低12bit為0x512,則其表示的立即數(shù)為0x04800000
這里,請(qǐng)大家不妨現(xiàn)在先思考2個(gè)問題,我們將在后續(xù)文章中予以解答:
1)、為什么ARM要這樣設(shè)計(jì),而不是按照我們最常見的想法(即:12bit就表示-2^11 -- 2^11-1中的數(shù))
2)、如果我們需要mov r0, #10000這樣的指令,應(yīng)該怎么辦?(常數(shù)10000不能按照如上的方法進(jìn)行表示)
3、寄存器間接尋址
寄存器間接尋址指令中的地址碼給出的是一個(gè)通用寄存器的編號(hào),所需的操作數(shù)保存在寄存器指定地址的存儲(chǔ)單元中,即寄存器為操作數(shù)的地址指針。例如:
LDR R0, [R2]表示將R2的值作為內(nèi)存地址,到該內(nèi)存處取出存放的數(shù),放到寄存器R0中
執(zhí)行LDR R0, [R2]前的情況 執(zhí)行LDR R0, [R2]后的情況
了解了基本的尋址方式后,我們現(xiàn)在來看一看最常用的匯編指令
1、單寄存器加載指令。主要有
加載字指令:LDR r0, [r1],將內(nèi)存中的一個(gè)字(4個(gè)字節(jié))加載到寄存器r0中
加載字節(jié)指令:LDRB r0, [r1],將內(nèi)存中的一個(gè)字節(jié)加載到寄存器r0中
有符號(hào)數(shù)加載字節(jié)指令:LDRSB r0, [r1],這條指令與上一條指令的不同之處在于,由于加載的是一個(gè)字節(jié),而不是一個(gè)字,所以需要確定寄存器r0的高24bit是什么。對(duì)于上一條指令,r0的高24bit補(bǔ)0,而本條指令,r0的高24bit補(bǔ)符號(hào)位,也就是補(bǔ)r0的bit7
2、單寄存器存儲(chǔ)指令。主要有
存儲(chǔ)字指令:STR r0, [r1],將r0中的值存儲(chǔ)到內(nèi)存的4個(gè)字節(jié)中
存儲(chǔ)字節(jié)指令:STRB r0, [r1],將r0的低8bit存儲(chǔ)到內(nèi)存的1個(gè)字節(jié)中
評(píng)論