arm程式設計模型
arm svc:復位,執行swi指令
快速中斷fiq:發生高優先順序的中斷
中斷irq:發生低優先順序的中斷
中止:訪問儲存器發生非法情況
未定義:執行指令,不能識別
系統:與使用者模式共用暫存器的特權模式
使用者:多數應用程式與系統任務執行在模式
2,工作模式的分類
異常/非異常:
異常:管理,快速中斷,中斷,中止,未定義
非異常:系統,使用者
特權/非特權
特權:管理,快速中斷,中斷,中止,未定義,系統
非特權:使用者模式
3,工作模式之間是是否可以切換,如何切換?
工作模式之間可以切換
切換的方式有兩種:
1,處理器自動切換:當發生異常,處理器自動進入對就的異常模式
2,指令切換
工作模式之間切換需要遵循的原則:
1,特權模式之間可以隨意切換
2,可以從特權模式進入到使用者模式,不能直接從使用者模式切換到特權模式
3,如果使用者模式切換到特權模式,可以通過呼叫swi指令來完成。
4,arm的執行狀態
5,執行狀態的切換
arm暫存器
arm支援的資料型別
記憶體的對齊方式:字、半字、位元組
arm儲存格式:大端、小端
arm指令:
彙編**示例:
.text
.code
32.global start //標號
start:
movr0,#10 // r0 = 10
ldr r1,=3 //偽指令
addr0,r0,r1 //
b .
.end
arm指令 示例
start:
cmp r0,r1 //比較r0-r1
beq not_copy //r0=r1相等時,跳轉到not_copy執行。相當於c語言中的goto語句
movr0,r1//r0 != r1時,r0=r1
not_copy:
.....
跳轉範圍: pc(new) = pc(當前) + 32mb 或 pc(當前) - 32mb
24bit用來表示偏移量
1bit 符號位
23bit偏移量 2^20 = 1mb ==>8*2^20 = 8mb
arm指令位址的特點:字對齊,最後的2bit為0
bl 指令跳出去執行完以後,會跳轉回來,而b指令則不會跳回來
bl 2000807 delay //bl相當於函式的執行,執行以後,會跳回來
start:
movr0,#1 //r0=1
movr1,#2 //r1=2
bl doadd //相當於c語言中呼叫函式
b.doadd
addr0,r0,r1 //ro = r0 + r1
mov pc,lr //返回函式指令, pc = lr ,lr是存放返回位址的
.code
32 //arm_code
arm_code:
adr r0,thumb_code + 1 //thumb_code + 1其實為:adr r0,arm_code,r0 = thumb_code + 1
bx ro//帶狀態切換的跳轉指令,在執行前會幹以下兩件事:
//1,cpsr[5] = r0[0],把當前狀態改為了thumb狀態 ;cpsr[5] = 0為表示arm狀態,cpsr[5] = 1表示thumb狀態
//2,pc = r0 & 0xfffffffe ==>把r0的第0位清0(因為前加了乙個1)
....code
16 //thumb_code
thumb_code:
adr r0,arm_code//理由同上
bx r0//1,cpsr[5] = r0[0],將當前狀態改為arm狀態
//2,pc = r0 & 0xfffffffe
....
相對跳**與當前pc相關
b bl
絕對跳**
bx bx: 指令是不帶返回的,絕對跳轉,調整範圍4g,跳轉到暫存器指定的位址
1,rm[0]給cpsr的1位,改變當前程式狀態
2,pc = r0 & 0xfffffffe
blx:既帶狀態又帶返回
1,儲存一條指定位址到lr
2,rm[0]給cpsr的1位,改變當前程式狀態
3,pc = r0 & 0xfffffffe
b:相對跳轉,pc(跳轉) = pc(當前) +/- 偏移量(32mb),跳過去不返回
bl:相對跳轉,pc(跳轉) = pc(當前) +/- 偏移量(32mb),跳過去會返回
cpu會將下一條指令的位址給lr,然後跳轉,通過手動返回,如:
mov pc,lr //手動返回,一般用於函式的呼叫
案例:
1,編寫sub.s ,sub.s**如下:
.text //**段
.code
32 //arm模式
.global do_sub
do_sub:
movr1,#10 //把10賦值給r1
movr0,#0x14
subr0,r0,r1
b . //
.end
2,安裝4.4.1交叉編譯器,因為這個低版本的編譯器裡面有arm-linux-gdb除錯工具
arm-0009q3.tar.bz2
編譯器安裝方法
cd /home/tarena
mkdir opt
cd opt
sudo tar jxvf /路徑
cd /home/tarena/opt/arm-2009q3/bin
cd /home/tarena
vi .bashrc
path = /解壓目錄/.../bin:$path:. #在.bashrc中最後一行新增這一句
修改完之後執行 「source .bashrc」讓環境變數生效
arm-linux-gcc -v 檢視最新的版本
檢視是否存在arm-linux-gdb:
arm-linux-g
cd /mnt/hgfs/1408/qemu/qemu
sudo dpkg -i * //解壓安裝
至此,執行環境搭建完畢
開始編譯sub.s檔案
cd 到sub.s檔案所在目錄:
cd /mnt/hgfs/1408/sub
arm-linux-as -g -o sub
.osub
.s#編譯,-g相當於在**中新增除錯資訊
arm-linux-ld -e do_sub -o sub
sub.o
#鏈結,do_sub是**中的乙個全域性標號,**從這開始執行
qemu-arm -g 1234
sub#將sub程式在qemu虛擬環境中執行
執行完「qemu-arm -g 1234 sub 」後,在虛擬機器中重新開啟乙個標籤頁,還是在相應的目錄下面,執行:
arm-linux-gdb sub
(gdb)targe remote localhost:1324
(gdb)s #s相當於單獨執行
(gdb)s #直到執行到 「b .」
(gdb)info r #檢視暫存器
彙編第八天
彙編形式目標 main proc push ebp mov ebp,esp 建立堆疊框架 push offset msg 匯入引數位址 call printf 呼叫函式 xor eax,eax 返回0 pop epb 扯掉框架 ret 0 返回主程式 main endp 結束 1.條件語句 cmp ...
開課第八天
開課第八天,今天因為遲到問題被老師訓了,呵呵,說實話是真的感覺前一周有點懶散鬆懈,今天被訓之後又感覺到了緊迫感,嗯,堅持就是勝利,加油。上午講題,下午講新知識,以下就是本寶寶吸收的新養料 方法 可以被稱作函式,也可以被稱作功能。1 main 是我們學習的第乙個簡單的方法,public static ...
前端第八天
迴圈繫結的變數汙染 在進行事件迴圈變數繫結時,由於函式體內部 並未執行,在繫結結束後,呼叫函式時,賦予的部分變數失去意義,解決方案 給頁面元素新增乙個任意屬性 事件與已有的函式進行繫結 只需要將函式位址繫結給事件,事件繫結完成將會有系統在特定情況下自動觸發 物件 字典 的增刪改查 物件元素格式為字串...