一:ARM寄存器
ARM指令主要是對寄存器她奥,棧瓮增、內(nèi)存的操作。寄存器位于CPU中哩俭,個數(shù)少速度快绷跑,ARM指令集中大部分指令都是對寄存器操作,但有些指令是對棧和內(nèi)存的操作凡资。下方會對操作棧砸捏、寄存器以及內(nèi)存的指令進行介紹。
指令占4個字節(jié)
command shfit m:放入地址隙赁,查看指令
共31個寄存器:X0~X30垦藏,分別如下
X0~X28、fp鸳谜、Ir
0~28膝藕、29、30
cpsr: 標記寄存器
ldr: 加載寄存器(load register)
stur: 這個指令
bl指令 跳轉(zhuǎn)咐扭,將下一條執(zhí)行的指令放入lr(X30)寄存器
ret 返回到lr寄存器所保存的地址 執(zhí)行代碼
lr 寄存器
pc 寄存器 指向馬上要執(zhí)行的代碼地址
sp 指向了我們棧
棧平衡(每個函數(shù)調(diào)用完畢之后芭挽,將拉伸的棧空間平衡(將sp加回去))
函數(shù)調(diào)用會開辟一段空間(椈确荆空間)
函數(shù)的局部變量袜爪、參數(shù)、寄存器的保護
參數(shù):x0 -- x7(個數(shù)有關(guān)系薛闪、數(shù)據(jù)類型也有關(guān))
多余的就會入棧
函數(shù)嵌套調(diào)用:
| - A(開辟) --> B(開辟) --> A(開辟)
| - A<-->A 死的遞歸(內(nèi)存溢出)
內(nèi)存分區(qū)域
代碼區(qū) 特點: 可讀可寫可執(zhí)行
棧區(qū)域 放參數(shù)和局部變量
堆區(qū)域 動態(tài)申請 可讀可寫
全局: 可讀可寫
常量區(qū): 只讀!
adrp x0, 1
1. 將1的值,左移12位 1 0000 0000 0000 == 0x1000
2.將PC寄存器的低12位清零 0x1002e6874 ==> 0x1002e6000
3.將將1 和 2 的結(jié)果相加 給 X0 寄存器!!
adrp 是計算指定的數(shù)據(jù)地址 到當(dāng)前PC值的相對偏移
由于得到的結(jié)果是低12bit為0
10 1024
12 == 4KB
1002e7f28
1.棧操作---- push 與pop
先簡單的聊一下棧的概念辛馆,“棧”說白了就是數(shù)據(jù)結(jié)構(gòu)的一種豁延,棧的數(shù)據(jù)結(jié)構(gòu)具有LIFO(last in first out) ---- 后進先出的特點昙篙。棧在ARM中所指的其實是一塊具有棧數(shù)據(jù)結(jié)構(gòu)特點內(nèi)存區(qū)。棧中主要用來暫存寄存器中的值得诱咏,比如R0寄存器正在使呢苔可,可是現(xiàn)在有一個優(yōu)先級比較高的函數(shù)要使用R0, 那么就先把R0的值Push到棧中暫存,然后等R0被優(yōu)先級更高的函數(shù)使用完畢后在從棧中Pop出之前的值袋狞。在函數(shù)調(diào)用時一般會對棧進行操作焚辅。
對棧操作的命令就是push和pop了映屋,一般會成對出現(xiàn),在函數(shù)開始時將該函數(shù)執(zhí)行時要使用的寄存器中的值push入棧同蜻,然后在函數(shù)結(jié)束時將之前push到棧中的值在pop到相應(yīng)的寄存器中棚点。
下方就是push和pop的用法的一個實例。在下方函數(shù)開始執(zhí)行前湾蔓,將該函數(shù)要使用的寄存器r4, r5, r7, lr使用push進行入棧操作瘫析,lr是該函數(shù)執(zhí)行后要返回的地址。在函數(shù)執(zhí)行完畢后卵蛉,使用pop命令將函數(shù)執(zhí)行前入棧的值在pop到相應(yīng)的寄存器中颁股。有一點需要注意的是將lr寄存器中的值在函數(shù)結(jié)束后pop到pc (Program Counter)寄存器中么库,pc寄存器中存儲的是將要執(zhí)行的命令的地址傻丝。這樣一來,函數(shù)執(zhí)行后就會返回到之前執(zhí)行的地址上繼續(xù)執(zhí)行诉儒。
2. pc寄存器中的中的標志位
此處我們以32位指令為例葡缰,pc寄存器中的后四位是標志位,第28 - 31位分別對應(yīng)著V (oVerflow)忱反,C (Carry)泛释,Z (Zero),N (Negative)温算。下面分別來介紹一下這四種符號所表示的狀態(tài)怜校。
N (Negative): 如果結(jié)果是負數(shù)則置位。
Z (Zero): 如果結(jié)果是零則置位注竿。
C (Carry): 如果有進位則置位茄茁。
V (Overflow): 在發(fā)生溢出的時候置位。
二:Xcode指令
當(dāng)你新建一個類的時候巩割, Xcode 會自動給你寫上以下代碼裙顽。
#import <Foundation/Foundation.h>
@interface Car : NSObject
@end
#import "Car.h"
@implementation Car
@end
Objective-C 編譯器指令是以 @ 打頭,它通常用來描述文件中的內(nèi)容宣谈。.h 文件中 @interface 指令用來標識文件的接口代碼的起始位置愈犹,而 @end 指令標示該段的結(jié)束位置。在 .m 文件中闻丑,@implementation 指令用來標識實現(xiàn)的起始位置漩怎,@end 標識結(jié)束位置
@interface 用于定義類的公共接口,通常嗦嗡,接口被稱為 API(application programming interface)而真正使對象能夠運行的代碼勋锤,位于 @implementation 中。