1错负、尋址方式:
mov r0, #1234
相當(dāng)于:r0=#1234刽酱。#開頭呻逆,表示16進(jìn)制時(shí),以0x開頭弥咪,如#0x1f。
mov r0, r1
執(zhí)行后十绑,r0 = r1聚至。
LSL:邏輯左移,移位后寄存器空出的低位補(bǔ)0本橙;
LSR:邏輯右移扳躬,移位后寄存器空出的高位補(bǔ)0;
ASR:算數(shù)右移甚亭,移位過程中贷币,符號(hào)位保存不變,如果源操作數(shù)為正數(shù)亏狰,則移位后空出的高位補(bǔ)0役纹,否則補(bǔ)1。
ROR:循環(huán)右移暇唾,移位后字管,移出的低位,填入移位空出的高位信不。
RRX:帶擴(kuò)展的循環(huán)右移嘲叔,操作數(shù)右移一位,移位空出的高位抽活,用C標(biāo)志的值填充硫戈。
mov r0, r1, lsl #2
相當(dāng)于:r0 = r1<<2 = r1*4。
ldr r0, [r1]? ? // 取值
相當(dāng)于:r0 = *r1下硕。
2丁逝、寄存器
ARM 有16個(gè)寄存器:
- r0-r3 主要用來傳遞函數(shù)調(diào)用第1到第4個(gè)參數(shù)(a0-a3)汁胆,更多的參數(shù)須通過棧來傳遞。
- r0-r1 也作為結(jié)果寄存器霜幼,保存函數(shù)返回結(jié)果嫩码;被調(diào)用的子程序在返回前無須恢復(fù)這些寄存器的內(nèi)容。
- r4-r9 為被調(diào)保存(callee-save)寄存器罪既,一般保存內(nèi)部局部變量(local variables)铸题。
- r7 大部分情況用來保存系統(tǒng)調(diào)用號(hào)(syscall number)。
- r9 某些變體可能當(dāng)作特殊寄存器琢感。
- r10(SL)被調(diào)保存寄存器丢间,Stack Limit。
- r11(FP)被調(diào)保存寄存器驹针, 幀指針(Flame Pointer)烘挫。
- r12(IP)特殊寄存器,棧寄存器(Intra Procedure)柬甥。
- r13(SP)特殊寄存器饮六,棧指針,類似x86_64中的RSP苛蒲。
- r14(LR)特殊寄存器喜滨。Link Register.
- r15(PC)特殊寄存器。Program Counter (like RIP in x86_64 & EIP in x86).
被調(diào)保存寄存器(callee-save register)是指撤防,如果這個(gè)寄存器被調(diào)用/使用之前虽风,需要被保存。
值得注意的是寄月,通常 ARM 模式下 r11 會(huì)作為幀指針辜膝,THUMB 模式下 r7 則作為幀指針。但在系統(tǒng)有可能根據(jù)自己的需要改變這個(gè)約定漾肮。
然后說明下厂抖,LR 或 Link Register(鏈接寄存器),這個(gè)寄存器會(huì)保存一個(gè)子程序(subroutine/函數(shù))的返回值克懊。當(dāng)一個(gè)子程序被調(diào)用時(shí)忱辅,LR 會(huì)被填入程序計(jì)數(shù)器(PC)。
還有 PC 寄存器谭溉,該寄存器或保存目前正在執(zhí)行的內(nèi)存地址墙懂。
PC 和 LR 都是跟代碼有關(guān)的寄存器,一個(gè)是 Where you are扮念,另外一個(gè)是 Where you were损搬。
再者,SP 寄存器,該寄存器指向棧頂巧勤。該棧是一塊用來存儲(chǔ)本地函數(shù)的內(nèi)存區(qū)域嵌灰。當(dāng)函數(shù)被返回時(shí), 存儲(chǔ)空間會(huì)被回收颅悉。
在堆棧上分配空間, 需要從棧寄存器(the stack register)減去沽瞭。
分配一個(gè)32位的值, 需要從堆棧指針(the stack pointer)減去4。
ARM堆棧結(jié)構(gòu)是從高向低壓棧的剩瓶。
因?yàn)樘幚砥魇?2位的ARM驹溃,所以每壓一次棧,SP就會(huì)移動(dòng)4個(gè)字節(jié)(32位)儒搭,也就是sp = sp-4。