arm第八天 彙編指令之跳轉指令

2021-07-25 04:47:18 字數 4212 閱讀 6756

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 ...

前端第八天

迴圈繫結的變數汙染 在進行事件迴圈變數繫結時,由於函式體內部 並未執行,在繫結結束後,呼叫函式時,賦予的部分變數失去意義,解決方案 給頁面元素新增乙個任意屬性 事件與已有的函式進行繫結 只需要將函式位址繫結給事件,事件繫結完成將會有系統在特定情況下自動觸發 物件 字典 的增刪改查 物件元素格式為字串...