60 likes | 191 Views
ARM 指令實驗. 實驗說明. 實驗目的: 通過實驗掌握 ARM 組合語言的使用方法。 實驗設備: 硬體使用 PC 主機,軟體使用 Embest IDE 2003 整合開發環境, Windows 98/2000/NT/XP 。 實驗內容: 使用簡單 ARM 組合語言,操作暫存器和記憶體區作互相的資料交換。. 實驗操作步驟. 執行 Embest IDE 整合開發環境,打開實驗系統常式目錄下 ARMcode_test 子目錄下的 ARMcode.ews 常式。 通過操作功能表欄或使用快捷命令編譯鏈結專案。
E N D
實驗說明 • 實驗目的: • 通過實驗掌握ARM組合語言的使用方法。 • 實驗設備: • 硬體使用PC主機,軟體使用Embest IDE 2003整合開發環境,Windows 98/2000/NT/XP。 • 實驗內容: • 使用簡單ARM組合語言,操作暫存器和記憶體區作互相的資料交換。
實驗操作步驟 • 執行Embest IDE整合開發環境,打開實驗系統常式目錄下ARMcode_test子目錄下的ARMcode.ews常式。 • 通過操作功能表欄或使用快捷命令編譯鏈結專案。 • 選擇Debug功能表Remote Connect 進行連接軟體模擬器,執行Download命令下載程式,並打開暫存器視窗。 • 單步執行程式並觀察和記錄暫存器R0-R15的值變化。 • 切換到組譯原始程式,分別在19行和35行設定中斷點,全速執行到中斷點;再單步執行程式,觀察和記錄暫存器R0-R15的值變化。 • 結合實驗內容和相關資料,觀察程式執行,通過實驗加深理解ARM指令的使用。
實驗參考程式 • #/* $Revision: 1.1.34.1 $: • # AREA Block, CODE, READONLY • .global _start • .text • _start: /*程式碼開始旗標*/ • .equ num, 20 /* 定義變數num,並賦值為20*/ • # ENTRY /* 程式入埠旗標*/ • start: • LDR r0, =src /* SRC標識的位址放入R0 */ • LDR r1, =dst /* DST標識的位址放入R1 */ • MOV r2, #num /* 裝載num的值到R2 */ • MOV sp, #0x400 /* 設定SP堆疊開始位址為 0x400*/
實驗參考程式 • blockcopy: • MOVS r3,r2, LSR #3 /* R2右移3位元後的值放入R3 */ • BEQ copywords /* 判斷是否為0,為0跳移*/ • STMFD sp!, {r4-r11} /* 把R4到R11的值保存到SP標識的堆疊中*/ • octcopy: • LDMIA r0!, {r4-r11} /* 把R0中的位址標識的內容順序裝載到R4到R11中*/ • STMIA r1!, {r4-r11} /* 把R4到R11的值順序保存到以R1起始位址的記憶體中*/ • SUBS r3, r3, #1 /* R3 -1 計數 */ • BNE octcopy /* 判斷結果是否為0,不為0 跳移*/ • /*需要注意的是,LDMIA或者STMIA指令執行後,R0,R1的值產生變化,每一次暫存器操作,R0或者R1的值會自動增加一個位元組的量,這裏操作了8個暫存器,R0或者R1的值也相應增加了8個位元組*/ • LDMFD sp!, {r4-r11} /* 把剛才保存的SP堆疊中的值恢復到R4到R11中*/
實驗參考程式 • copywords: • ANDS r2, r2, #7 /* 邏輯與,把R2前7位元扔掉*/ • BEQ stop /* 判斷是否為0,為0跳移*/ • wordcopy: • LDR r3, [r0], #4 /* 把R0表示位址的內容的後4位元全部拷貝到R3*/ • STR r3, [r1], #4 /* 把R3的內容,放入以R1為起始位址的4位元記憶體中*/ • SUBS r2, r2, #1 /* R2 –1 放回R2 */ • BNE wordcopy /* 判斷是否為0,不為0跳移 */ • /*同樣的,這裏R0,R1操作後,R0,R1會自動加上便宜量*/ • stop: • B stop /*程式結束,進入閉環*/ • src: • .long 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 /*定義了一個資料區,以SRC為起始位址*/ • dst: • .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /*定義了一個資料區,以DST為起始位址*/