欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

【嵌入式開發(fā)】ARM匯編(指令分類|偽指令|協(xié)處理器訪問 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!

您當(dāng)前位置>首頁 » 新聞資訊 » 技術(shù)分享 >

【嵌入式開發(fā)】ARM匯編(指令分類|偽指令|協(xié)處理器訪問

發(fā)表時間:2020-11-5

發(fā)布人:葵宇科技

瀏覽次數(shù):117


做者 : 韓叔詒趨
??吞熘?: http://blog.csdn.net/shulianghan/article/details/42408137 
孜請出名出處


本專客相放文檔下載
-- ARM 匯編腳冊 : http://download.csdn.net/detail/han1202012/8328375
-- ARM 腳冊 : http://download.csdn.net/detail/han1202012/8324641
-- ARM 9 芯片文檔 : http://download.csdn.net/detail/han1202012/8332389
-- ARM 11 芯片文檔 : http://download.csdn.net/detail/han1202012/8332403







一. ARM 匯編概腳


1. 匯編利用掏諢


匯編掏諢
-- 平代碼 : Bootloader 初初化時對 CPU 跟 協(xié)處理器 等盡行初初化, 此時出有成偶起 C 道話砸嬋境, 那噶勘辰應(yīng)映鰱編道話實行初初化早縱;
-- 服從哀供 : 匯編服從下, Linux 你核中, 對服從有出該侑供的天圓必要匯編;





2. 匯編分類


(1) ARM 蔽布匯編


ARM 蔽布匯編簡納
-- 利用處景 : 實用于ARM公公的匯編器, 卑適正在 Windows 卣龔利用, 如ADS;





(2) GNU匯編




GNU 匯編簡納
-- 利用處景 : 實用于 Linux 卣龔穿插編譯東西鏈的匯編器;





3. ARM 匯編晨囹典范拷




ARM 匯編拷
-- ARM 匯編拷示積

.section .data
	< 初初環(huán)崮肥據(jù)>
.section .bss
	< 背初初環(huán)崮肥據(jù)>
.section .text
.global _start
_start:
	<匯崩代碼>
-- 晨囹典范民氣 : "_start:" 是匯編晨囹典范的民氣, 蝦帽于 main();
-- 蔽并民氣 : 利用 ".global _start" 蔽并晨囹典范民氣, 中朝渤梟能辨認(rèn)那是晨囹典范民氣;
-- 標(biāo)門霪碼段 : ".section .text" 標(biāo)明那是一個代碼段;
-- 標(biāo)明 bss 段 : 利用 ".section .bss" 標(biāo)明bss段, 如出有雅出有 bss 段 跟 肥據(jù)段, 曲接哪當(dāng)ツ倒 .text 初步;





4. 拆建匯編斥地調(diào)試環(huán)境



(1) 匯編晨囹典范預(yù)報




晨囹典范代碼
-- 定義代碼段 : .text ;
-- 定義晨囹典范民氣 : .globl _start;
-- 代碼示積

.text
.globl _start
_start:
	mov r1,#1
	mov r2,#2
	mov r3,#3

Makefile 代碼 :
-- 鏈接 elf 格局文取 : 扇髏晨囹典范肇端掏諢 6410叭佑是 0x50008000 天址;
-- 正在 arm-linux-ld 指定晨囹典范肇端天址 : 正在 -Ttext 50008000 即可;
-- 如出有雅利用鏈接譜鰱本指定天址 : 寄看第三行指定晨囹典范肇端天址;

SECTIONS
{
	. = 0x50008000;

	. = ALIGN(4);
	.text :
	{
		led.o	(.text)
		*(.text)
	}

	. = ALIGN(4);
	.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }

	. = ALIGN(4);
	.data : { *(.data) }


	. = ALIGN(4);
	.bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
}

-- 代碼示積 : 

all:start.o
	arm-linux-ld -Ttext 0x50008000 -o start.elf $^

%.o:%.S
	arm-linux-gcc -g -o $@ $^ -c

clean:
	rm -rf *.o *.elf




(2) 平 JLink 調(diào)試




JLink 調(diào)試平
-- 確保驅(qū)隊置 : 寄看 要拆置 Windows 驅(qū)動;
-- 連接 JLink : 實擬機(jī)左下匠連接 JLink;
[img]http://img.blog.csdn.net/20150105022413642

-- 平 JLinkGDBServer
[root@localhost JLink_Linux_V434a]# ./JLinkGDBServer 
SEGGER J-Link GDB Server V4.34a

JLinkARM.dll V4.34a (DLL compiled Aug 31 2011 11:51:40)

Listening on TCP/IP port 2331

J-Link connected
Firmware: J-Link ARM V8 compiled Aug 24 2011 17:23:32
Hardware: V8.00
S/N: 17935099
Feature(s): RDI,FlashDL,FlashBP,JFlash

J-Link found 2 JTAG devices, Total IRLen = 5
JTAG ID: 0x07B76F0F (ARM11)






(2) eclipse 調(diào)試環(huán)境


拆建 eclipse 調(diào)試環(huán)境
-- 導(dǎo)家逝世程 : 拘旭 Makefile Project With Existing Code;
[img]http://img.blog.csdn.net/20150105020511673

-- 拘旭導(dǎo)進(jìn)的代碼掏諢
[img]http://img.blog.csdn.net/20150105020542859

-- clean 代碼 : 拘旭 "Project" --> "Clean";
[img]http://img.blog.csdn.net/20150105020714212

-- build 工程 : 拘旭 "駁昆" --> Project --> Build All 選項即可;
-- 拆備 Debug 調(diào)試好肥
[img]http://img.blog.csdn.net/20150105021019281

[img]http://img.blog.csdn.net/20150105021026531

[img]http://img.blog.csdn.net/20150105021110178

-- 實行調(diào)試 : F6 單步調(diào)試走兩步, 可能再 Register 視圖中查抄存放器的值, 可能看到 r1 跟 r2 被賦值為 1 跟 2 了;
[img]http://img.blog.csdn.net/20150105022529552







兩. ARM 指令分類


 
ARM 匯編腳冊
-- CSDN 下載天址 : http://download.csdn.net/detail/han1202012/8328375.
孜請出名出處

[img]http://img.blog.csdn.net/20150105153819531



GNU 匯編 取 ARM 蔽布匯編好別 : 膳春沔的腳冊是 ARM 蔽布匯編腳冊, 我們寫的是 GNU 匯編腳冊, 有肯侗趁別;
-- 哪當(dāng)ツ倒小寫好別 : ARM 蔽布匯編 緊是哪當(dāng)ツ倒寫的, GNU 匯編可所以小寫字母;

1. 算收跟邏輯指令




(1) MOV 指令


MOV 指令簡納 : 賦值媒電縱;
-- 語放局 : MOV <dest>, <op1>;
-- 語法分解 : dest 識探針存放器, op1 可所以緩速肥, 也能夠是存放器, 天址等, 等睹于 dest = op1;
匯編晨囹典范解釋 : 匯編中利用 "@" 背跚加加解釋;


示積代碼

.text
.global _start
_start:

@mov 指令典范
mov r1, #8	@粗 8 賦值給 r1
mov r2, r1	@粗 r1 中的值賦值給 r2
mov r3, #10	@粗 10 賦值給 r3 存放器






(2) MVN 指令


MVN 指令簡納 : 取反賦值媒電縱;
-- 語放局 : MVN <dest>, <op1>;
-- 語法分解 : 粗早縱肥 op1 取反后 賦值給 dest;


指令示積
-- 代碼

.text
.global _start
_start:

@mvn 指令典范
mvn r1, #0b10	@0b10 兩盡造肥取反, 賦值給 r1
mvn r2, #5	@5 十盡造肥取反, 賦值給 r2
mvn r3, r1	@粗 r1 存放器的值, 賦值給 r3






(3) SUB 指令



SUB 指令簡納 : 加法早縱;
-- 語放局 : SUB <dest>, <op1>, <op2>;
-- 語法分解 : dest 存放加法膠匣有雅, op1 是加肥, op2 是被加肥, dest = op1 - op2;
-- 寄看 : dest op1 緊出有磕驏有及應(yīng)映齪速肥, op2 可能應(yīng)映齪速肥;


代碼示積
.text
.global _start
_start:

@sub 指令典范
@sub r1, #4, #2 缺萊戮積, 加肥出有磕驏有及是緩速肥, 必需是存放器
mov r2, #4
sub r1, r2, #4
mov r0, #1
sub r3, r1, r0


(4) ADD 指令



ADD 指令簡納 : 加法早縱;
-- 語放局 : ADD <dest>, <op1>, <op2>;
-- 語法分解 : dest 存放加法膠匣有雅, op1 跟 op2 蝕亨加瞪個肥, dest = op1 + op2;
-- 寄看 dest op1 緊出有磕驏有及應(yīng)映齪速肥, op2 可能應(yīng)映齪速肥;
代碼示積
@add 指令典范
mov r2, #1
add r1, r2, #3

(5) AND 指令



AND 指令簡納 : 邏輯取早縱;
-- 語放局 : AND <dest>, <op1>, <op2>;
-- 語法分解 : dest 存紛輯庸匣有雅, op1 跟 op2 蝕亨擁郎個肥, dest = op1 & op2;
-- 寄看 dest op1 緊出有磕驏有及應(yīng)映齪速肥, 必需利用存放器, op2 可能應(yīng)映齪速肥;
代碼示積
.text
.global _start
_start:

@and 指令典范
mov r1, #5
and r2, r1, #0

mov r1, #5
mov r2, r1, #1

(6) BIC 指令


BIC 指令簡納 : 位荒紈指令早縱;
-- 語放局 : AND <dest>, <op1>, <op2>;
-- 語法分解 : dest 存放位荒紈膠匣有雅, op1 是被荒紈的東西, op2 是掩碼;
-- 示積 : "bic r0, r0, #0b1011", 荒紈 r0 中的 第0, 1, 3 位, 別的位脆持出有變, 膠匣有雅放進(jìn) r0 中;
-- 寄看 dest op1 緊出有磕驏有及應(yīng)映齪速肥, 必需利用存放器, op2 可能應(yīng)映齪速肥; 
-- 兩盡造暗示 : 掩碼中 % 正在蔽布匯編末示兩盡造, 但是正在 GNU 匯編中沒法利用, GNU 匯編中利用 0b 代閉盡造;
代碼示積
.text
.global _start
_start:

@bic 指令典范
mov r1, #0b101011
bic r2, r1, #0b101	@粗r1 的 0, 2 位荒紈


2. 比較指令





(1) CMP 指令



CMP 指令簡納 : 比較指令;
-- 語放局 : CMP <op1>, <op2>;
-- 語法分解 : 比較膠匣有雅有三種 op1 > op2 (CPSR N = 0), op1 = op2 (CPSR Z = 1), op1 < op2 (CPSR N = 1), 膠匣有雅放進(jìn) CPSR 存放器;
代碼示積
.text
.global _start
_start:

@cmp 指令典范
mov r1, #2
cmp r1, #1

mov r1, #2
cmp r1, #3

mov r1, #2
cmp r1, #2

(2) TST 指令



TST 指令簡納 : 比較指令;
-- 語放局 : TST <op1>, <op2>;
-- 語法分解 : op1 跟 op2 安開取早縱, 膠匣有雅影響 CPSR 存放器, 如出有雅膠匣有雅 出無為 0, CPSR 的 Z = 0, 如出有雅膠匣有雅為0, Z = 1;
代碼示積 
.text
.global _start
_start:

@cmp 指令典范
mov r1, #0b101
tst r1, #0b001	@安開庸匣有雅是 0b1, 膠匣有雅出無為0, CPSR Z = 0

mov r1, #0b101
tst r1, #0b10	@安開庸匣有雅是 0, 膠匣有雅出無為



3. 妨空指令




(1) B 指令


B 指令簡納 : 妨空指令;
-- 語放局 : B{前提} 天址;
-- 語法分解 : 如出有遜干足前提, 便跳桌越 天址 掏諢, 如出有雅出有滿足前提, 便實行下里的語句, 如出有雅出有前提, 便是 100% 實行;;
代碼示積 
-- 前提闡發(fā) : gt 是哪當(dāng)ツ倒于前提, 如出有雅 r1 > r2 便走前提妨空, 出有然便持絕實行現(xiàn)位條;
.text
.global _start
_start:

@b 妨空指令典范
mov r1, #6
mov r2, #5
cmp r1, r2	@比較 r1 跟 r2 中的值
@b 后可能跟一個前提, {前提} 正在 {} 中便是可加可出有加, 如出有雅出有前提便勢掇前提100%實行
@gt 是哪當(dāng)ツ倒于前提指令, 如出有彥詘提知碰齜Ⅷ桌越 branch1, 如出有雅出有滿足便實行下里的指令
bgt branch1
add r3, r1, r2
b end	@那里為聊驏有實行 branch1 早縱, 曲接跳桌越 end 實行

branch1:
sub r3, r1, r2

end:
nop

(2) BL 指令


BL 指令簡納 : 帶連接的妨空指令;
-- 語放局 : BL{前提} 天址;
-- 語法分解 如出有遜干足前提, 便跳桌越 天址 掏諢, 如出有雅出有滿足前提, 便實行下里的語句, 如出有雅出有前提, 便是 100% 實行;;
代碼示積 
.text
.global _start
_start:

@bl 帶連接的妨空指令典范
mov r1, #2
cmp r1, #1
@此時跳桌越 func1, func1 實行完晨囹典范沒法前來, 如出有雅 利用 bl 跳轉(zhuǎn), 晨囹典范會前來
@b func1
@此時利用 bl 跳桌越 func1 實行, func1 實行結(jié)束后會前來實行下里的語句
bl func1		

mov r1, #2
cmp r1, #3

func1:
mov r1, #2
cmp r1, #2

mov r1, #4
cmp r1, #6

4. 移唯獨(dú)少令


(1) LSL 指令


LSL 指令簡納 : 邏輯做篤指令;
-- 語放局 : Rx, LSL#2;
-- 語法分解 : 粗 Rx 存放器中的值, 做篤2 位;
代碼示積 :
.text
.global _start
_start:

@lsl 做篤指令典范
mov r1, #0b1
@粗 r1 中的值, 做篤 2 位, 放進(jìn) r1 存放器中
mov r1, r1, lsl#2

(2) ROR 指令


ROR 指令簡納 : 輪回庸指令;
-- 語放局 : Rx, ROR#2;
-- 語法分解 : 粗 Rx 存放器中的值 輪回庸 2 位;
代碼示積 
.text
.global _start
_start:

@ror 輪回庸指令典范
mov r1, #0b11
@膠匣有雅是 ob1000...0001
mov r1, r1, ror#1

5. 晨囹典范骰荻髑轢字拜訪指令


晨囹典范骰荻髑轢字 : CPSRSPSR;
-- 寄看 : 晨囹典范骰荻髑轢字 出有磕驏有及利用 通用存放器的語句 如 MOV 等拜訪, 必需利用 晨囹典范骰荻髑轢存放器的 公用指令 讀寫;
孜請出名出處


代碼示積 
.text
.global _start
_start:

@mrs 指令典范
@rs 是 粗 s -> r, sr 是 r -> s
mrs r0, cpsr	@粗 cpsr 中的肥據(jù)搬移到 r0 中
orr r0, #0b100	@粗 cpsr 中的第三掏詘詎1
msr cprs, r0


6. 存儲撇癘訪指令


(1) STR 指令





STR 指令簡納 : 粗 存放器中的值 保存到 你存中;
-- 語放局 : str r0, 天址;
-- 語法分解 : 粗 R0 存放器中的值 保存到 你湊軌址中;;
代碼示積
.text
.global _start
_start:

@str 指令典范
mov r0, #0xff
@粗 r1 值改成 50000000 (OK-6410)
str r0, [r1]

-- 調(diào)試 : 加加天紙編控, 正在 Memory 視圖中盡行監(jiān)控;

(2) LDR 指令



LDR 指令簡納 : 粗 存放器中的值 保存到 你存中;
-- 語放局 : ldr r0, 天址;
-- 語法分解 : 粗 你湊軌址中 存放的值 加載進(jìn) r0 中;
代碼示積
@ldr 指令典范
mov r0, #0xff
@粗 r1 值改成 50000000 (OK-6410)
str r0, [r1]
ldr r0, [r1]


7. 以上全部代碼示積




以上全部代碼示積 : 便于調(diào)試進(jìn)建;

.text
.global _start
_start:

@ldr 指令典范
mov r0, #0xff
@粗 r1 值改成 50000000 (OK-6410)
str r0, [r1]
ldr r0, [r1]

@str 指令典范
mov r0, #0xff
@粗 r1 值改成 50000000 (OK-6410)
str r0, [r1]

@mrs msr 指令典范
@rs 是 粗 s -> r, sr 是 r -> s
mrs r0, cpsr	@粗 cpsr 中的肥據(jù)搬移到 r0 中
orr r0, #0b100	 晨囹典范民氣, 用法 ".globol _start", 寄看前里加上里;@粗 cpsr 中的第三掏詘詎1
msr cprs, r0

@ror 輪回庸指令典范
mov r1, #0b11
@膠匣有雅是 ob1000...0001
mov r1, r1, ror#1

@lsl 做篤指令典范
mov r1, #0b1
@粗 r1 中的值, 做篤 2 位, 放進(jìn) r1 存放器中
mov r1, r1, lsl#2

@bl 帶連接的妨空指令典范
mov r1, #2
cmp r1, #1
@此時跳桌越 func1, func1 實行完晨囹典范沒法前來, 如出有雅 利用 bl 跳轉(zhuǎn), 晨囹典范會前來
@b func1
@此時利用 bl 跳桌越 func1 實行, func1 實行結(jié)束后會前來實行下里的語句
bl func1		

mov r1, #2
cmp r1, #3

func1:
mov r1, #2
cmp r1, #2

mov r1, #4
cmp r1, #6

@b 妨空指令典范
mov r1, #6
mov r2, #5
cmp r1, r2	@比較 r1 跟 r2 中的值
@b 后可能跟一個前提, {前提} 正在 {} 中便是可加可出有加, 如出有雅出有前提便勢掇前提100%實行
@gt 是哪當(dāng)ツ倒于前提指令, 如出有彥詘提知碰齜Ⅷ桌越 branch1, 如出有雅出有滿足便實行下里的指令
bgt branch1
add r3, r1, r2
b end	@那里為聊驏有實行 branch1 早縱, 曲接跳桌越 end 實行

branch1:
sub r3, r1, r2

end:
nop

@cmp 指令典范
mov r1, #0b101
tst r1, #0b001	@安開庸匣有雅是 0b1, 膠匣有雅出無為0, CPSR Z = 0

mov r1, #0b101
tst r1, #0b10	@安開庸匣有雅是 0, 膠匣有雅出無為

@cmp 指令典范
mov r1, #2
cmp r1, #1

mov r1, #2
cmp r1, #3

mov r1, #2
cmp r1, #2

@bic 指令典范
mov r1, #0b101011
bic r2, r1, #0b101	@粗r1 的 0, 2 位荒紈

@and 指令典范
mov r1, #5
and r2, r1, #0

mov r1, #5
mov r2, r1, #1

@add 指令典范
mov r2, #1
add r1, r2, #3

@mov 指令典范
mov r1, #8	@粗 8 賦值給 r1
mov r2, r1	@粗 r1 中的值賦值給 r2
mov r3, #10	@粗 10 賦值給 r3 存放器

@mvn 指令典范
mvn r1, #0b10	@0b10 兩盡造肥取反, 賦值給 r1
mvn r2, #5	@5 十盡造肥取反, 賦值給 r2
mvn r3, r1	@粗 r1 存放器的值, 賦值給 r3

@sub 指令典范
@sub r1, #4, #2 缺萊戮積, 加肥出有磕驏有及是緩速肥, 必需是存放器
mov r2, #4
sub r1, r2, #4
mov r0, #1
sub r3, r1, r0






三. ARM 實指令


好考文檔 : ARM 文檔 Page 110, 膳春沔庸末給下載.

1. ARM 機(jī)器碼






(1) 機(jī)器碼反匯編示積


匯編晨囹典范實行僚鎏 : 匯崩代碼 --> 匯編器 --> 機(jī)器碼 --> CPU 砸嫘;


反匯編示積 : 找迪蘋個 elf 文取, 利用 arm-linux-objdump 反匯編;
-- 敕獷 : 利用 arm-linux-objdump -S -D start.elf 敕獷盡行反匯編, 此中 "50008000: e3a01001 mov r1, #1 ; 0x1" 中的 "e3a01001" 便是機(jī)器碼, 來郝放蔽并朝分;
[img]http://img.blog.csdn.net/20150106012156627

-- 反匯編朝分膠匣有雅

[root@localhost 04_assembly]# arm-linux-objdump -S -D start.elf 

start.elf:     file format elf32-littlearm

Disassembly of section .text:

50008000 <_start>:
.text
.globl _start
_start:
	mov r1,#1
50008000:	e3a01001 	mov	r1, #1	; 0x1
	mov r2,#2
50008004:	e3a02002 	mov	r2, #2	; 0x2
	mov r3,#3
50008008:	e3a03003 	mov	r3, #3	; 0x3
Disassembly of section .debug_aranges:


(2) 機(jī)器碼格局




機(jī)器碼格局 : 盡圖自 arm 文檔 P110;
-- ARM 機(jī)器碼位肥 : 32位;
-- 機(jī)器碼分段
[img]http://img.blog.csdn.net/20150106012609317






(3) 分解 MOV 指令機(jī)器碼




代碼預(yù)報
-- 匯崩代碼

.text
.globl _start
_start:

	mov r0, r1
	moveq r0, #0xff

-- Makefile 足本

all:start.o
	arm-linux-ld -Ttext 0x50008000 -o start.elf $^

%.o:%.S
	arm-linux-gcc -g -o $@ $^ -c

clean:
	rm -rf *.o *.elf

反匯編 elf 文取
-- 反匯背柃容 : 衰略下里擋嗇當(dāng)ツ倒朝分;

[root@localhost 04_assembly]# arm-linux-objdump -S -D start.elf 

start.elf:     file format elf32-littlearm

Disassembly of section .text:

50008000 <_start>:
.text
.globl _start
_start:

	mov r0, r1
50008000:	e1a00001 	mov	r0, r1
	moveq r0, #0xff
50008004:	03a000ff 	moveq	r0, #255	; 0xff
Disassembly of section .debug_aranges:

匯編洞喀機(jī)器碼
-- "mov r0, r1" : 十六盡造 0xe1a00001, 兩盡造      11100001101000000000000000000001;
-- "moveq r0, #0xff" : 十六盡造 0x03a000ff, 兩盡造 00000011101000000000000011111111;


機(jī)器碼分解

第一條 : 1110 00 0 1101 0 0000 0000 000000000001

第兩條 : 0000 00 1 1101 0 0000 0000 000011111111
-- 前提位比較 (第冶 31 ~ 28) :  第一條是 1110 洞喀 AL 老是實行,  第兩條是 0000 洞喀 EQ;
-- 保存位比較 (第兩段 27 ~ 26) : 第一條 00, 第兩條 00, 分明緊一樣;
-- I 早縱肥范例標(biāo)識位 (第三段 25) : 筆記最鶴蠡個存緩速肥 還是存放器, 如出有雅是 0 暗示存放器, 如出有雅是 1 暗示緩速肥;
-- 早縱碼位 (第四段 24 ~ 21) : 辨別出有卑指令, 1101 是 MOV 指令;
-- S 自逢存放器竄改標(biāo)識 (第五段 20) : 是可影響 CPSR 存放器, 如出有雅 S = 0 出有影響, 如出有雅 S = 1 影響;
-- Rn 源早縱存放器 (第六段 19 ~ 16) : MOV 跟 MVN 出無益用 Rn 位, 存放器編號;
-- Rd 方針早縱存放器 (第七段 15 ~ 12) : 存放器編號;
-- shifter_operand 源早縱書 (第八段 11 ~ 0) : 源早縱肥, 那個取 I 位結(jié)卑起來, 如出有雅 I = 0, 弄位暗示存放器編號, 如出有雅 I = 1, 弄位暗示 緩速肥哪當(dāng)ツ倒小, 緩速肥使┬范車濫, 如出有雅超出會報錯, 那里便必要利用實指令了;





(4) 機(jī)器碼相放文檔




相放文檔
-- 位泛檔 : P116, The ARM Instruction Set, A3.4.1 Instruction encoding;
-- MOV 跟 MVN 指令 : 機(jī)器碼格局 "<opcode1>{<cond>}{S} <Rd>, <shifter_operand>", 出有 Rn 字段, 弄字段出用;
孜請出名出處

[img]http://img.blog.csdn.net/20150106014430148

-- 前提偉諛檔 : Page 112, The ARM Instruction Set, A3.2.1 Condition code 0b1111;
[img]http://img.blog.csdn.net/20150106014656414



2. 實指令


實指令簡納 : 實指令出有洞喀的機(jī)器碼, 那種指令只正在編譯時起傳染感動, 實指令必要轉(zhuǎn)化成 別的匯編指令砸嫘, 如 定義 宏, 出涌張擺力械碼;





(1) globol 實指令


globol 實指令納紹
-- 實指簾倡染感動 : 用于定義 晨囹典范民氣, 用法 ".globol _start", 寄看前里加上里;
-- 代碼示積

.text
.global _start
_start:

@lsl 做篤指令典范
mov r1, #0b1
@粗 r1 中的值, 做篤 2 位, 放進(jìn) r1 存放器中
mov r1, r1, lsl#2




(2) data acsii byte word 實指令


實指令納紹 : 
-- 實指簾倡染感動 : data 用于定義 肥據(jù)段, 標(biāo)明背里的肥據(jù)存放到肥據(jù)段中; acsii 標(biāo)米鮒符串鄙范例, byte 標(biāo)明 byte 范例鄙, word  標(biāo)明 word 范例鄙;


代碼示積
-- 匯崩代碼 : start.S ;

.data	@定義肥據(jù)鄙
hello:	@標(biāo)明鄙天址, 字符串鄙
.ascii "Hello World !"
bh:	@標(biāo)明鄙天址, byte 鄙
.byte 0x1
ADD:	@標(biāo)明鄙天址, word 鄙
.word 0xff

.text
.global _start
_start:

mov r0, #0xff
-- make 足本 : Makefile;

all: start.o 
	arm-linux-ld -Ttext 0x50008000 -o start.elf start.o
	
start.o : start.S
	arm-linux-gcc -g -o start.o -c start.S
	
.PHONY: clean
clean:
	rm *.o *.elf *.bin

闡發(fā) elf 文取 : 利用 arm-linux-readelf -a start.elf 敕獷闡發(fā) start.elf 文取; 
-- .data 段天址 : 寄看 [2] 中 .data 天址為 0x50010004;
[img]http://img.blog.csdn.net/20150106125048109
-- 肥據(jù)鄙
[img]http://img.blog.csdn.net/20150106125157421
-- elf 文幽紂發(fā)齊文
octopus@octopus:~/arm/demo$ arm-linux-readelf -a start.elf 
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x50008000
  Start of program headers:          52 (bytes into file)
  Start of section headers:          33100 (bytes into file)
  Flags:                             0x5000002, has entry point, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         2
  Size of section headers:           40 (bytes)
  Number of section headers:         11
  Section header string table index: 8

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        50008000 008000 000004 00  AX  0   0  4
  [ 2] .data             PROGBITS        50010004 008004 000012 00  WA  0   0  1
  [ 3] .debug_aranges    PROGBITS        00000000 008018 000020 00      0   0  8
  [ 4] .debug_info       PROGBITS        00000000 008038 000048 00      0   0  1
  [ 5] .debug_abbrev     PROGBITS        00000000 008080 000014 00      0   0  1
  [ 6] .debug_line       PROGBITS        00000000 008094 000037 00      0   0  1
  [ 7] .ARM.attributes   ARM_ATTRIBUTES  00000000 0080cb 000014 00      0   0  1
  [ 8] .shstrtab         STRTAB          00000000 0080df 00006c 00      0   0  1
  [ 9] .symtab           SYMTAB          00000000 008304 000180 10     10  13  4
  [10] .strtab           STRTAB          00000000 008484 000087 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x008000 0x50008000 0x50008000 0x00004 0x00004 R E 0x8000
  LOAD           0x008004 0x50010004 0x50010004 0x00012 0x00012 RW  0x8000

 Section to Segment mapping:
  Segment Sections...
   00     .text 
   01     .data 

There is no dynamic section in this file.

There are no relocations in this file.

There are no unwind sections in this file.

Symbol table '.symtab' contains 24 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 50008000     0 SECTION LOCAL  DEFAULT    1 
     2: 50010004     0 SECTION LOCAL  DEFAULT    2 
     3: 00000000     0 SECTION LOCAL  DEFAULT    3 
     4: 00000000     0 SECTION LOCAL  DEFAULT    4 
     5: 00000000     0 SECTION LOCAL  DEFAULT    5 
     6: 00000000     0 SECTION LOCAL  DEFAULT    6 
     7: 00000000     0 SECTION LOCAL  DEFAULT    7 
     8: 50010004     0 NOTYPE  LOCAL  DEFAULT    2 hello
     9: 50010011     0 NOTYPE  LOCAL  DEFAULT    2 bh
    10: 50010011     0 NOTYPE  LOCAL  DEFAULT    2 $d
    11: 50010012     0 NOTYPE  LOCAL  DEFAULT    2 ADD
    12: 50008000     0 NOTYPE  LOCAL  DEFAULT    1 $a
    13: 50008004     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_end
    14: 50010016     0 NOTYPE  GLOBAL DEFAULT  ABS _bss_end__
    15: 50010016     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start__
    16: 50008004     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_start
    17: 50010016     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_end__
    18: 50008000     0 NOTYPE  GLOBAL DEFAULT    1 _start
    19: 50010016     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
    20: 50010018     0 NOTYPE  GLOBAL DEFAULT  ABS __end__
    21: 50010016     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    22: 50010018     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    23: 50010004     0 NOTYPE  GLOBAL DEFAULT    2 __data_start

No version information found in this file.
Attribute Section: aeabi
File Attributes
  Tag_CPU_arch: v4
  Tag_ARM_ISA_use: Yes




(3) equ 實指令


equ 實指令納紹 : 
-- 實指簾倡染感動 : 弄指杜是定義炒囁;
-- 代碼示積 

.text
.global _start
_start:

@定義一個宏鄙
.equ DA, 0x68

@粗 DA 值賦值給 r0 存放器
mov r0, #DA



(4) align 實指令



align 實指令納紹 : 
-- 實指簾倡染感動 : 標(biāo)錳郵據(jù)對齊;


對齊代碼示積
-- 露有對頻濫代碼
.data	@定義肥據(jù)鄙
hello:	@標(biāo)明鄙天址, 字符串鄙
.ascii "Hello World !"
bh:	@標(biāo)明鄙天址, byte 鄙
.byte 0x1
ADD:	@標(biāo)明鄙天址, word 鄙
.word 0xff

.text
.global _start
_start:

@定義一個宏鄙
.equ DA, 0x68

@粗 DA 值賦值給 r0 存放器
mov r0, #DA

-- 出有露對頻濫代碼
.data	@定義肥據(jù)鄙
hello:	@標(biāo)明鄙天址, 字符串鄙
.ascii "Hello World !"
.align 4
bh:	@標(biāo)明鄙天址, byte 鄙
.byte 0x1
ADD:	@標(biāo)明鄙天址, word 鄙
.word 0xff

.text
.global _start
_start:

@定義一個宏鄙
.equ DA, 0x68

@粗 DA 值賦值給 r0 存放器
mov r0, #DA

代碼 elf 你容比較 : 那濫睽略哪當(dāng)ツ倒朝分, 只給出你存洞喀天址, 查抄對齊你容;
-- 出有對頻濫代碼 : 0x50010011 分門鯔有磕驏有及被 4 合除;
[img]http://img.blog.csdn.net/20150106131115687

-- 對頻濫代碼 : 0x50010020 可能被4合除, 此時已盡行了對齊;
[img]http://img.blog.csdn.net/20150106131210489










3. 早縱類實指令


(1) ldr 實指令


機(jī)器碼 shifter_operand 段分解
-- 段分解 : 此中 4 位存放位移值, 8 位存放肥值, 是以 緩速肥出有磕驏有及超過 8位, 最哪當(dāng)ツ倒 0xFF;
-- 缺里 : 沒法利用 哪當(dāng)ツ倒的肥字;
-- 示積

.text
.global _start
_start:

mov r0, #0xFFF
-- 編譯缺里

octopus@octopus:~/arm/demo$ make
arm-linux-gcc -g -o start.o -c start.S
start.S: Assembler messages:
start.S:5: Error: invalid constant (fff) after fixup
make: *** [start.o] 缺里 1



ldr 實指令
-- 傳染感動 : 可能 背存放器中賦值 哪當(dāng)ツ倒緩速肥;
-- 語放局 : "ldr r0, =0xFFF", 寄看 出無益用 # , 利用 = 背里加上緩速肥;
-- 代碼示積 : 此時能編夷嬪功, 0xfff 被賦值給 r0 存放器;

.text
.global _start
_start:

ldr r0, =0xFFF
-- 反匯編 elf 代碼

octopus@octopus:~/arm/demo$ arm-linux-objdump -S -D start.elf 

start.elf:     file format elf32-littlearm

Disassembly of section .text:

50008000 <_start>:
.text
.global _start
_start:

ldr r0, =0xFFF
50008000:	e51f0004 	ldr	r0, [pc, #-4]	; 50008004 <_start+0x4>
50008004:	00000fff 	.word	0x00000fff
Disassembly of section .debug_aranges:

... ...
-- 闡發(fā)反匯崩代碼 : "50008000: e51f0004 ldr r0, [pc, #-4] ; 50008004 <_start+0x4>" 代濾注解 ldr r0, =0xFFF 使│用 ldr 打劫你存指令, 哪當(dāng)ツ倒 pc - 4 天址上打劫虐逃ス︽儲的值, "50008004: 00000fff .word 0x00000fff"  注解 體系粗 0xFFF 定義正在了 pc -4 你湊軌址中;



(2) nop 實指令



nop 實指令 : 
-- 傳染感動 : 盡行延時, 正在一皓對時屑咬供較下的晨囹典獎⑿, 利用弄指令盡行一噶勘鐘狄子時;
-- 代碼示積 : 

.text
.global _start
_start:

nop
-- 反匯編 : nop 實指令實行了 "mov r0, r0" 那個無抑五的早縱;

octopus@octopus:~/arm/demo$ arm-linux-objdump -S -D start.elf 

start.elf:     file format elf32-littlearm

Disassembly of section .text:

50008000 <_start>:
.text
.global _start
_start:

nop
50008000:	e1a00000 	nop			(mov r0,r0)
Disassembly of section .debug_aranges:

... ...






三. 協(xié)處理撇癘訪指令


1. 協(xié)處理器簡納




協(xié)處理器簡納
-- 傳染感動 : 實行特定處理任務(wù), 加沉處理器背擔(dān);
-- 肥教協(xié)處理器 : 緊張盡行肥字處理;
-- 協(xié)處理器收撐 : ARM 芯片最多收撐 16 個協(xié)處理器, 最重依閱協(xié)處理器 是 CP15;


CP15 協(xié)處理器傳染感動 : CP15 是體系把持存放器, 經(jīng)過過程那些存放器, 拆備取把持 緩存, MMU, 包庇體系, 時鐘方式 跟 別的體系好肥;
-- 如何拜訪 CP15 : 經(jīng)過過查拜訪 CP15 中的存放撇鷓持膳春沔的好肥, CP15 供給了 16 組存放器;
-- 文檔 : 
[img]http://img.blog.csdn.net/20150106134113875

 





2. 協(xié)處理撇癘訪指令


mcr 指令分解 : 陳情睹 ARM11 文檔, P145, 3.2;
-- 傳染感動 : 辭天存放器中的肥據(jù) 賦值給 CP15 的存放器;
-- 語放局 : "MCR{cond} P15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>";
-- 語法分解 : CRn 暗示 CP15 存放器蝕口藏一組, CRm 也是組名;
-- 代碼示積

.text
.global _start
_start:

@"MCR{cond} P15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>"
@打劫 MainID 存放器
mcr p15, 0, r0, c0, c0, 0

-- 文檔盡圖
[img]http://img.blog.csdn.net/20150106140749093

-- CP15 存放撇癘訪 : 如出有雅打劫 MainID 存放器, 便取前里擋嗇些 CRn Op1 CRm Op2 等好肥;
[img]http://img.blog.csdn.net/20150106140831499




做者 : 韓叔詒趨
??吞熘?nbsp;: http://blog.csdn.net/shulianghan/article/details/42408137 
孜請出名出處


本??拖喾盼臋n下載 
-- ARM 匯編腳冊 : http://download.csdn.net/detail/han1202012/8328375
-- ARM 腳冊 : http://download.csdn.net/detail/han1202012/8324641
-- ARM 9 芯片文檔 : http://download.csdn.net/detail/han1202012/8332389
-- ARM 11 芯片文檔 : http://download.csdn.net/detail/han1202012/8332403

相關(guān)案例查看更多