網(wǎng)站帶做收錄排名專門做推廣的軟文
?
目錄
匯編整體分類
1.指令
2.偽操作
3.偽指令
匯編代碼
匯編初始化
數(shù)據(jù)搬運(yùn)指令
算術(shù)運(yùn)算指令
加法
減法
乘法
比較指令
跳轉(zhuǎn)指令
邏輯運(yùn)算指令
與或,異或
左移右移
內(nèi)存操作 LOAD/STORE 指令
寫
讀
CPU的棧機(jī)制
棧的概念
棧的種類
1.空棧(Empty)
2.滿棧(Full)
棧的基本操作
PUSH/POP
棧的應(yīng)用
葉子函數(shù)
非葉子函數(shù)
匯編整體分類
1.指令
????????編譯完生成一條機(jī)器碼存儲(chǔ)在內(nèi)存單元當(dāng)中,CPU執(zhí)行時(shí)能完成對(duì)應(yīng)的操作(類似于C中的語句)
2.偽操作
????????偽操作(相當(dāng)于c中的#的內(nèi)容,告訴編譯器怎么編譯),不會(huì)生成機(jī)器碼也不會(huì)占用內(nèi)存,其作用是告訴編譯器怎樣編譯(類似于C中的預(yù)處理指令)
3.偽指令
????????偽指令不是指令,編譯器在編譯時(shí)將其替換成等效的指令 (如:cpu中沒有乘法器,對(duì)應(yīng)沒有乘法指令,3*3 ---》用加法器實(shí)現(xiàn)3+3+3,替換實(shí)現(xiàn))
匯編代碼
匯編初始化
?AREA ???STACK, NOINIT, READWRITE
__initial_spAREA ???RESET, DATA, READONLY
__Vectors ??????DCD ????__initial_spDCD ????main ?????????????AREA ???|.text|, CODE, READONLYENTRY
mainloopB loop ?????????????????END
1.AREA STACK, NOINIT, READWRITE: 這一行指定了一個(gè)名為STACK的內(nèi)存區(qū)域,它用于存儲(chǔ)堆棧。NOINIT表示這個(gè)內(nèi)存區(qū)域在程序啟動(dòng)時(shí)不需要初始化,READWRITE表示這個(gè)內(nèi)存區(qū)域可以被讀取和寫入。
2.__initial_sp: 這一行定義了一個(gè)名為`__initial_sp`的符號(hào),它表示堆棧指針的初始值。在這里,它被定義為堆棧的起始地址。通常,這個(gè)符號(hào)會(huì)在鏈接腳本中進(jìn)一步定義為實(shí)際的堆棧內(nèi)存區(qū)域的起始地址。
3.AREA RESET, DATA, READONLY: 這一行指定了一個(gè)名為RESET的內(nèi)存區(qū)域,用于存儲(chǔ)重置向量表。DATA表示這個(gè)區(qū)域包含數(shù)據(jù),READONLY表示這個(gè)區(qū)域只能被讀取。
4.__Vectors DCD __initial_sp: 這一行定義了一個(gè)重置向量表,用于指示程序啟動(dòng)時(shí)應(yīng)該執(zhí)行的操作。`DCD`表示存儲(chǔ)一個(gè)雙字(32位)的數(shù)據(jù)。在這里,第一個(gè)雙字存儲(chǔ)的是堆棧指針的初始值,即__initial_sp。
5.DCD main: 這一行將程序的入口地址(main函數(shù))添加到重置向量表中。這意味著程序在啟動(dòng)時(shí)將跳轉(zhuǎn)到main函數(shù)開始執(zhí)行。
6.AREA |.text|, CODE, READONLY: 這一行指定了一個(gè)名為.text的內(nèi)存區(qū)域,用于存儲(chǔ)代碼。CODE表示這個(gè)區(qū)域包含代碼,READONLY表示這個(gè)區(qū)域只能被讀取。
7.ENTRY main: 這一行指定了程序的入口點(diǎn)為main函數(shù)。這意味著程序?qū)?#96;main`函數(shù)開始執(zhí)行。
8.loop B loop: 這一行是一個(gè)無限循環(huán),它會(huì)不斷地跳轉(zhuǎn)到`loop`標(biāo)簽所在的位置,導(dǎo)致程序永遠(yuǎn)循環(huán)執(zhí)行這條指令。
9.END: 這一行表示程序的結(jié)束。
數(shù)據(jù)搬運(yùn)指令
改變PC的值實(shí)現(xiàn)程序跳轉(zhuǎn)
?AREA ???STACK, NOINIT, READWRITE
__initial_sp ????????????????AREA ????????????????RESET, DATA, READONLY
__Vectors ??????DCD ????__initial_sp ?????????????????DCD ????main ??????????????????????????????AREA ???|.text|, CODE, READONLY ????????????????ENTRY
main ?
MOVS R0,#2
MOVS R1,R0
;改變PC的值實(shí)現(xiàn)程序跳轉(zhuǎn),0x08000008
;先把地址給一個(gè)寄存器,再把這個(gè)寄存器的值賦給PC
LDR R2,=0x08000008
MOV PC,R2
loop ????????????????B loop ??????????????????????????????????
END
算術(shù)運(yùn)算指令
加法
????AREA ???STACK, NOINIT, READWRITE
__initial_sp ????????????????AREA ????????????????RESET, DATA, READONLY
__Vectors ??????DCD ????__initial_sp ?????????????????DCD ????main ??????????????????????????????AREA ???|.text|, CODE, READONLY ????????????????ENTRY
main ?
MOVS R0,#2
MOVS R1,R0
ADDS R3,R0,R1 ?;R3=0X04
LDR R8,=0X01
ADD R8,R8,R3 ??;R8=R8+R3 =0X05
loop ????????????????B loop ??????????????????????????????????
END
減法
????AREA ???STACK, NOINIT, READWRITE
__initial_sp ????????????????AREA ????????????????RESET, DATA, READONLY
__Vectors ??????DCD ????__initial_sp ?????????????????DCD ????main ??????????????????????????????AREA ???|.text|, CODE, READONLY ????????????????ENTRY
main ?
MOVS R0,#2
MOVS R2,#2
MOVS R1,R0
SUBS R2,R0,R1 ?;R2=R0-R1
loop ????????????????B loop ??????????????????????????????????
END
乘法
????AREA ???STACK, NOINIT, READWRITE
__initial_sp ????????????????AREA ????????????????RESET, DATA, READONLY
__Vectors ??????DCD ????__initial_sp ?????????????????DCD ????main ??????????????????????????????AREA ???|.text|, CODE, READONLY ????????????????ENTRY
main ?
MOVS R0,#2
MOVS R2,#2
MOVS R1,R0
MULS R2,R0,R2 ?;R2=R0*R2
loop ????????????????B loop ??????????????????????????????????
END
比較指令
跳轉(zhuǎn)指令
????AREA ???STACK, NOINIT, READWRITE
__initial_sp ????????????????AREA ????????????????RESET, DATA, READONLY
__Vectors ??????DCD ????__initial_sp ?????????????????DCD ????main ??????????????????????????????AREA ???|.text|, CODE, READONLY ????????????????ENTRY
JUMP
MOVS R0,#1
MOVS R2,#1
LDR R3,=0X0800001A
MOV PC,R3main ?
MOVS R0,#2
MOVS R2,#2
MOVS R1,R0
CMP R0,R2 ?;if(a==b)
BEQ JUMP ?
MOVS R0,#3
loop ????????????????B loop ??????????????????????????????????
END
????AREA ???STACK, NOINIT, READWRITE
__initial_sp ????????????????AREA ????????????????RESET, DATA, READONLY
__Vectors ??????DCD ????__initial_sp ?????????????????DCD ????main ??????????????????????????????AREA ???|.text|, CODE, READONLY ????????????????ENTRY
JUMP
MOVS R0,#1
MOVS R2,#1
MOV PC,LRmain ?
MOVS R0,#2
MOVS R2,#2
MOVS R1,R0
BL JUMP
MOVS R0,#3
loop ????????????????B loop ??????????????????????????????????
END
邏輯運(yùn)算指令
與或,異或
????AREA ???STACK, NOINIT, READWRITE
__initial_sp ????????????????AREA ????????????????RESET, DATA, READONLY
__Vectors ??????DCD ????__initial_sp ?????????????????DCD ????main ??????????????????????????????AREA ???|.text|, CODE, READONLY ????????????????ENTRYmain ?
MOVS R0,#2 ? ;R0:0010
MOVS R1,#1 ;R1:0001
ANDS R1,R1,R0 ??;R1=R1&R0 R1=0000
EORS R1,R1,R0 ??; 0010 ?0000 ?0010
loop ????????????????B loop ???END
左移右移
??AREA ???STACK, NOINIT, READWRITE
__initial_sp ????????????????AREA ????????????????RESET, DATA, READONLY
__Vectors ??????DCD ????__initial_sp ?????????????????DCD ????main ??????????????????????????????AREA ???|.text|, CODE, READONLY ????????????????ENTRYmain ?
MOVS R0,#2 ? ;R0:0010 ?左移1位 ?0100--4
MOVS R1,#1 ;R1:1
LSLS R0,R0,R1
loop ????????????????B loop ???END
內(nèi)存操作 LOAD/STORE 指令
寫
讀
CPU的棧機(jī)制
棧的概念
棧是一種具有特殊的訪問方式的存儲(chǔ)空間,特殊性就在于后進(jìn)先出
棧的種類
1.空棧(Empty)
棧指針指向的地址是空的,在棧中存儲(chǔ)數(shù)據(jù)時(shí),可以直接存儲(chǔ),存儲(chǔ)完成之后需要將棧指針再次指向空的位置。
EA:Empty Ascending 空增棧
ED:Empty Descending 空減棧
2.滿棧(Full)
棧指針指向的地址有數(shù)據(jù),在棧中存儲(chǔ)數(shù)據(jù)時(shí),需要先將棧指針,指向一個(gè)空的位置,然后在存儲(chǔ)數(shù)據(jù)。
增棧(Ascending)
????????棧指針向高地址方向移動(dòng)
減棧(Descending)
????????棧指針向低地址方向移動(dòng)
FA:Full Ascending 滿增
FD:Full Descending 滿減
ARM默認(rèn)采用的是滿減棧
棧指針指向有數(shù)據(jù)的頂,接收數(shù)據(jù)時(shí),棧指針先移動(dòng),再放數(shù)據(jù)。指針的移動(dòng)是地址的降低
棧的基本操作
棧有兩種基本的操作:入棧和出棧
1.入棧:將一個(gè)新的元素放到棧頂
2.出棧:從棧頂取出一個(gè)元素
棧頂元素總是最后一個(gè)入棧的,需要出的時(shí)候,又會(huì)是第一個(gè)被取出的
操作規(guī)則:LIFO后進(jìn)先出
PUSH/POP
PUSH 入棧,壓棧
POP 出棧,彈棧
//主程序給R1,R2,R3,R4分別存入:0x11111111 0x22222222 0x33333333 0x44444444然后跳入函數(shù)JUMP
//2.寫一個(gè)函數(shù)JUMP,函數(shù)內(nèi)修改R1為0x20000001 R3為0x00000000
//3.修改結(jié)束后返回主函數(shù)
//4.主函數(shù)再使R1和R3相加后存入R1跳出主程序進(jìn)入死循環(huán)
//子程序返回主程序時(shí),不可以使用MOV指令和B BL BX BXLAREA ???STACK, NOINIT, READWRITE
__initial_sp ????????????????AREA ????????????????RESET, DATA, READONLY
__Vectors ??????DCD ????__initial_sp ?????????????????DCD ????main ??????????????????????????????AREA ???|.text|, CODE, READONLY ????????????????ENTRY
main ?ADD SP,SP,#0X100;上調(diào)棧指針LDR R1,=0X11111111;LDR R2,=0X22222222;LDR R3,=0X33333333;LDR R4,=0X44444444;BL JUMPADD R1,R1,R3B loop
JUMPPUSH {R0-R4,LR} ;保護(hù)現(xiàn)場LDR R1,=0X44324302;LDR R3,=0X33222055;POP{R0-R4,PC} ;恢復(fù)現(xiàn)場
loop ????????????????B loop ???
END
棧的應(yīng)用
葉子函數(shù)
????????葉子函數(shù)是指一個(gè)函數(shù)內(nèi)部沒有調(diào)用其他函數(shù)的函數(shù),也就是說,它是程序調(diào)用樹的末端節(jié)點(diǎn),不依賴于其他函數(shù)。
非葉子函數(shù)
????????非葉子函數(shù)是指一個(gè)函數(shù)內(nèi)部調(diào)用了其他函數(shù)的函數(shù),也就是說,它不是程序調(diào)用樹的末端節(jié)點(diǎn),可以被其他函數(shù)調(diào)用。