微處理機 Microprocessor (100上) ARM 內核嵌入式SOC原理 組合語言基本介紹與軟體工具學習 2011/9/22
開啟 IAR Embedded Workbench 請到 開始>所有程式>IAR System … 根據下圖指示開啟 IAR Embedded Workbench 或從桌面點選捷徑開啟
選擇 “create new project in current workspace”
Tool cahin 部份請選擇 ARM ,然後根據下圖所示點選 asm ,它會展開一個 asm 的分支,表示現在要開啟的是預設為組合語言的 project 按ok後,會出現另一視窗,請輸入 project的檔名與選擇要存放的地方(全英數) project的副檔名為 .ewp
IAR Embedded Workbench的工作環境 在 project 內預設的組合語言檔案名稱為 asm 可於存檔時修改,其副檔名為 .s79 注意: 先將預設的組合語言程式架構手動清除掉
實驗範例 MOV R0, #0 MOV R1, #1 MOV R2, #2 MOV R3, #3 MOV R4, #4 MOV R5, #5 MOV R6, #6 MOV R7, #7 MOV R8, #8 MOV R9, #9 MOV R10, #10 B B . 在主程式區,重新輸入左邊的指令. 此段程式功能為 將常數值 0~10 (十進制) 依序各別存放到 R0~R10暫存器裡.
指令輸入完成後,按 make鍵(圖示)或是F7鍵 ,此時會對你剛輸入的程式作編譯,編譯完成後若沒有錯誤發生則可在 Messages 視窗下看見相關訊息. 在編譯完成無錯誤後 按Debug鍵(圖示)或是Crtl+D鍵 ,進入 Debug 模式. Debug 鍵圖示 Make 鍵圖示
第一次進入 Debug 模式時,通常只會跳出Disassembly(反組譯)的視窗. 但是在執行程式碼時,我們同時也要觀察暫存器與記憶體內容的值,故以後在作實驗時,我們在這至少要打開三種功能視窗 1.Disassembly 2. Register 3.Memory . 打開方式: 在toolbar上的 View 下拉後,可依需要而選擇.
目前在 Debug 模式下,會使用到的一些功能說明: Rest : 將程式重置.PC會被Clear為0 並從 address 0 開始執行指令. Step into (F11): 單步執行.每按一次,程式只執行一道指令. run to cursor: 若程式有設中斷點,則會跑到中斷點程式就會停止. GO : 自動執行整個程式的指令,不會單步動作需要按 stop才會停止. Exit Debug: 離開Debug模式, 回到前面編輯模式. 中斷點:當程式變複雜時,可藉用中 斷點的設定來幫助除錯 (可以設定多個中斷點)
暫存器視窗 在目前模式下的暫存器 舉例說明: 假設 Processor目前在FIQ 的模式下,則在目前模式下的 R8~R14會與 R8_fiq~R14_fiq 暫存器的值相等,且當內容改變時會同步的變化. 有關暫存器各種模式下的配置問題, 請參考課本. 在每個模式下的 SPSR 均可以點選 下拉,觀察裡面的各旗標值(flag) .
Memory 視窗 預設為 位元組(Byte)顯示模式 對著 Memory 視窗按右鍵勾選 4xUnits 即可改變為字組(Word)顯示模式. 排列方式勾選 Little Endian .
指令格式 MOV R1, #1 e3a01001 11100011101000000001000000000001 1110 001 1101 0 0000 0001 000000000001
當按下 step into 單步執行的圖示後, 綠色的指標就會往下跑一個指令,表示這是下次所要執行的指令. 指令被執行時,相對應之暫存器的內容若有改變時 則會以紅色的數值來表示.
基本指令格式 <op>{<cond>}{S} Rd, Rn, #<32-bit immediate> <op>{<cond>}{S} Rd, Rn, Rm {<shift>} 基本指令 存入暫存器 MOV Rd, Rn ; Rd = Rn MOV Rd, #12 ; Rd = 12 加減乘 ADD r0, r1, r2 ; r0 = r1 + r2 SUB r0, r1, r2 ; r0 = r1 – r2 MUL r0, r1, r2 ; r0 = r1 * r2 左右移動,旋轉 MOV Rd, Rn LSL #3 ; Rd = Rn * 23
最後 ,若存檔完要關畢IAR Embedded Workbench 並離開時,記得要儲存目前的 workspace ,其 workspace 的副檔名為 .eww
實習問題 實習一: 用16進位值將(25,17)存入(R1,R2),即R1=25, R2=17 並且將 (1)R1+R2 (2)R1-R2 (3)R1*R2 分別顯示在 R3, R4, R5 實習二: 請將(6+8)X4+(32/16)=?用組合語言表示出來,利用左右移動, 將運算結果指定存放在R11暫存器中 實習三:將R1=2 並且只使用兩行指令 計算出 R11 = R1*35 (不可直接使用乘法指令) 作完請找助教檢查