130 likes | 301 Views
軟體工具學習與組合語言撰寫 STACK & SUB FUNCTION 2011/10/6. 微處理機 Microprocessor (100 上 ) ARM 內核嵌入式 SOC 原理. 資料傳送指令. LDR r0, [r1] ;r0 = mem32[r1] STR r0, [r1] ;mem32[r1] = r0 LDR r0,[r1,#4] ;r0 = men32[r1+ 4] LDR r0,[r1,#4]! ;r0 = mem32[r1+ 4] ;
E N D
軟體工具學習與組合語言撰寫STACK & SUB FUNCTION2011/10/6 微處理機 Microprocessor (100上) ARM 內核嵌入式SOC原理
資料傳送指令 • LDR r0, [r1] ;r0 = mem32[r1] • STR r0, [r1] ;mem32[r1] = r0 • LDR r0,[r1,#4] ;r0 = men32[r1+ 4] • LDR r0,[r1,#4]! ;r0 = mem32[r1+ 4] ; r1 = r1+ 4 • LDR r0, [r1], #4 ;r0 := mem32 [r1] r1 := r1 + 4
Why use stack instruction • 一次存取多個 • loop + STR r0,[r1,#4]! VS STMIA • loop + LDR r0,[r1,#4]! VS LDMIA
{先加後存} {先減後存} r9’ → r9 → STMIB r9!,{r0,r1,r5} →mem[r9 + 4] = r0 mem[r9 + 8] = r1 mem[r9 + 12] = r5 r9 = r9 + 12 STMDB r9!,{r0,r1,r5} →mem[r9 - 4] = r5 mem[r9 - 8] = r1 mem[r9 - 12] = r0 r9 = r9 - 12 r9 → r9’ → {先存後加} {先存後減} STMDA r9!,{r0,r1,r5} →mem[r9] = r5 mem[r9 - 4] = r1 mem[r9 - 8] = r0 r9 = r9 - 12 r9’ → r9 → STMIA r9!,{r0,r1,r5} →mem[r9] = r0 mem[r9 + 4] = r1 mem[r9 + 8] = r5 r9 = r9 + 12 r9 → r9’ →
{先加後取} {先減後取} r9→ r9’→ → r5 → r1 → r0 LDMIB r9!,{r0,r1,r5} →r0 = mem[r9 + 4] r1 = mem[r9 + 8] r5 = mem[r9 + 12] r9 = r9 + 12 r9’→ r9 → LDMDB r9!,{r0,r1,r5} →r5 = mem[r9 - 4] r1 = mem[r9 - 8] r0 = mem[r9 - 12] r9 = r9 - 12 → r5 → r1 → r0 {先取後加} {先取後減} r9→ r9’→ → r5 → r1 → r0 LDMDA r9!,{r0,r1,r5} →r5 = mem[r9] r1 = mem[r9 - 4] r0 = mem[r9 - 8] r9 = r9 - 12 r9’→ r9 → LDMIA r9!,{r0,r1,r5} →r0 = mem[r9] r1 = mem[r9 + 4] r5 = mem[r9 + 8] r9 = r9 + 12 → r5 → r1 → r0
範例(cont.) • 當store為STMIA 時,load 應選擇哪一個指令才能正確讀取數值,想想為什麼 ? • Try it : 當store為STMIB,STMDA,STMDB 應選擇哪一個 並觀察 • data 在memory的address為何 ? • 指標(R0) • 在執行store之後跟load之後的變化 • 在不同的堆疊指令的變化
範例(cont.) • Try it !! • save • STMFD STMFA STMED STMEA • load • LDMFD LDMFA LDMED LDMEA
SUB FUNCTION • A common requirement in a program is to be able to branch to a subroutine in a way • It possible to resume the original code sequence when the subroutine has completed
SUB FUNCTION • step • 利用Branch 指令跳入 sub function • 並將pc(R15)存入於R14中 by branch and link (BL) • 完成sub function的動作 • 將下一步的address回存到R15 (pc) • 回到主函式
實習問題 實習一: 將起始位址為100H的陣列的五筆資料 79H,500H,200H,30H,40H,使用STM,LDM指令,將這五筆資料改存放在起始位址為200H的記憶體空間 實習二: 使用sub function 的方式寫出 R10=4!, 並且最後與main function 的 R11=10 做相加 實習三: 寫一迴圈,將陣列值 01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH,10H 順序對調,為 0DH,0EH,0FH,10H,09H,0AH,0BH,0CH,05H,06H,07H,08H,01H,02H,03H,04H 加分題: 將陣列五筆資料79H 500H200H 30H 40H由大到小排序 作完請找助教檢查