知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
【嵌入式開發(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. 晨囹典范骰荻髑轢字拜訪指令
晨囹典范骰荻髑轢字 : CPSR 跟 SPSR;
-- 寄看 : 晨囹典范骰荻髑轢字 出有磕驏有及利用 通用存放器的語句 如 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)案例查看更多
相關(guān)閱讀
- 網(wǎng)絡(luò)營銷
- 汽車回收管理
- 云南網(wǎng)站建設(shè)制作
- 麗江小程序開發(fā)
- 昆明網(wǎng)絡(luò)公司
- 云南省建設(shè)廳網(wǎng)站
- 汽車拆解管理系統(tǒng)
- 用戶登錄
- Web開發(fā)框架
- 前端
- 網(wǎng)站建設(shè)列表網(wǎng)
- 云南做百度小程序的公司
- 云南網(wǎng)頁制作
- 小程序被攻擊
- 云南網(wǎng)站設(shè)計
- 云南電商網(wǎng)站建設(shè)
- 云南小程序開發(fā)公司哪家好
- 微信分銷系統(tǒng)
- 開發(fā)微信小程序
- 云南小程序商城
- 云南網(wǎng)站維護(hù)
- 搜索排名
- 商標(biāo)
- 報廢車拆解軟件
- 網(wǎng)站建設(shè)首選
- 云南小程序代建
- 云南網(wǎng)絡(luò)營銷
- 網(wǎng)絡(luò)公司報價
- 小程序
- 網(wǎng)站建設(shè)高手