Bài tập có lời giải và code đính kèm chương 6 sách vi điều khiển Embedded Systems with ARM CortexM Microcontrollers in Assembly Language and C (Third Edition – Dr Yifeng Zhu ) , nội dung các bài tập bao gồm: Chuyển đổi từ code C sang code asm, tính trung bình cộng của một dãy số nguyên cho trước, tính tổng lập phương, chuyển đổi ký tự thường sang ký tự hoa, tính năng lượng theo công thức e= mc2, tính giá trị biểu thức, xác định nghiệm phương trình bậc hai, so sánh với 0, tìm giá trị của hàm số, tìm số nhỏ nhất, so sánh hai ngày, tính tổng bình phương, tính giai thừa, ma trận và các phép toán liên quan.
LẬP TRÌNH VI ĐIỀU KHIỂN STM32L152 (Sách Embedded Systems with ARM Cortex-M Microcontrollers in Assembly Language and C (Third Edition) – Dr Yifeng Zhu ) Đại Học Bách Khoa Đà Nẵng BÀI TẬP CHƯƠNG SÁCH (Có code đính kèm) 6.1 Translate_Code Đề : dịch đoạn chương trình asm sau sang ngơn ngữ lập trình C MOV r2, #1 MOV r1, #1 loop CMP r1, r0 BGT done MUL r2, r1, r2 ADD r1, r1, #1 B done loop MOV r0, r2 Code: int main(void){ int result, n = 3, i; result = 1; for(i = 1; i = a CMP r1,r3 ; kiem tra b < c BGE else ; dung neu b >= c MOVS r4, r1 ; = b STR r4, [r2] B stop else MOVS STR r4, [r2] stop B program hangs here ; luu gia tri vao bo nho r4, r3 ; = c stop ENDP ALIGN AREA myData, DATA, READWRITE ; dead loop & ALIGN DCD END 6.12 CompareDate Đề : Giả sử hai ngày lưu trữ nhớ sau Viết chương trình asm so sánh hai ngày, ngày trước ngày 2, thiết lập ghi r0 lên 1, trường hợp lại thiết lập r0 -1 AREA, myData, DATA date1 DCD 12, 31, 2014 ; month, day, year date2 DCD 01, 20, 2013 ; month, day, year Code: INCLUDE stm32l1xx_constants.s ; Load Constant Definitions INCLUDE stm32l1xx_tim_constants.s ; TIM Constants AREA dateCompare, CODE, READONLY EXPORT linker main ; make main visible to ENTRY main PROC ; Ngay truoc thi set ghi r0 len va set r0 -1 voi nhung truong hop khac LDR r1, =date1 LDR r2, =date2 ; &date2[0] ; so sanh nam truoc LDR r3, [r1, #8] ; nam LDR r4, [r2, #8] ; nam CMP r3, r4 MOVLO r0, #1 Lower - nam truoc nam thi set r0 len BLO stop MOVHI Higher BHI ; LO = unsigned on r0, #-1 ; HI = unsigned on stop ; So sanh thang LDR r3, [r1] ; thang LDR r4, [r2] ; thang CMP r3, r4 MOVLO thi set r0 len BLO ; thang truoc thang r0, #-1 ; sau thi set r0 stop MOVHI len -1 BHI r0, #1 stop ; So sanh LDR r3, [r1, #4] ; LDR r4, [r2, #4] ; CMP r3, r4 MOVLO thi set r0 len BLO ; truoc r0, #-1 ; sau thi set r0 stop MOVHI len -1 BHI r0, #1 stop stop B stop ; dead loop & program hangs here ENDP ALIGN AREA myData, DATA, READWRITE ALIGN date1 DCD ; month, date, year 12, 31, 2014 date2 DCD ; month, date, year 01, 20, 2013 END 6.13 TongBinhPhuong Đề : Viết chương trình asm tính tổng biểu thức sau Biến n lưu trữ ghi r0, tổng bình phương lưu trữ ghi r1 𝑛 sum = ∑𝑖=1 12 + 22 + 32 + ⋯ 𝑛2 Code: INCLUDE stm32l1xx_constants.s ; Load Constant Definitions INCLUDE stm32l1xx_tim_constants.s ; TIM Constants AREA main, CODE, READONLY EXPORT main ; make main visible to linker ENTRY main PROC MOV r0, #4 ;n=4 MOV r1, #0 ; result = MOV r2, #1 ; i=1 loop CMP r2, r0 ; so sanh i voi n BGT stop ; re nhanh neu lon hon MLA r1, r2, r2, r1 LDR r3, =sum STR r1, [r3] ADD r2, r2, #1 B loop stop ; result = i*i + result ; i = i+1 B stop ; dead loop & program hangs here ENDP ALIGN AREA myData, DATA, READWRITE ALIGN sum DCD END 6.14 Factorial Đề : Viết chương trình asm tính tổng giai thừa số ngun khơng âm Giả sử n cho ghi r0 kết lưu ghi r1 Code: INCLUDE stm32l1xx_constants.s ; Load Constant Definitions INCLUDE stm32l1xx_tim_constants.s ; TIM Constants AREA factorial, CODE, READONLY EXPORT main ; make main visible to linker ENTRY main PROC MOV r1, #1 ; kq = MOV r0, #5 ;n=5 MOV r2, #1 ;i=1 loop CMP r2, r0 ; so sanh i voi n BGT next ; vao stop neu lon hon MUL r1, r1, r2 ; kq = kq*i ADD r2, r2, #1 ; i= i+1 B loop next STR stop LDR r3, =result r1, [r3] B stop ENDP ALIGN AREA myData, DATA, READWRITE ALIGN result END DCD ; dead loop & program hangs here 6.15 2Dmatrix Đề : Khi ma trận chiều (2D) khai báo chương trình C Ma trận thực tế lưu mảng chiều nhớ Chương trình C sử dụng cách tiếp cận theo hàng để chuyển đổi ma trận hai chiều thành mảng chiều Ví dụ sau cách lưu trữ ma trận 3*3 nhớ ……… Dịch chương trình C sau sang chương trình asm Chương trình asm phải chứa hai vòng lặp Int a[4][3] = { {11, 12, 13} {21, 22, 23} {31, 32, 33} {41, 42, 43} }; Void main (void){ int i, j ; for(i =0 ; i < ; i ++){ for (j = ; j< ; j++) a[i][j] = 2*a[i][j]; return; } Code: INCLUDE stm32l1xx_constants.s ; Load Constant Definitions INCLUDE stm32l1xx_tim_constants.s ; TIM Constants AREA main, CODE, READONLY EXPORT main ; make main visible to linker ENTRY main PROC ; r0 = &matrix[0], r1 = row, r2 = col, r3 = &row or &col, r4 = a[i][j], r5 = i, r6 = j, r7 = &a[i][0] LDR r0, =matrix ; r0 = &matrix[0] LDR r3, =row LDR r1, [r3] ; so luong hang = LDR r3, =col LDR r2, [r3] ; so luong cot = MOVS r5,#0 ;i=0 B check_i loop_i MOVS r6,#0 B check_j ;j=0 loop_j MUL r7,r5,r2 ; r7 = i * so luong cot ADD r7,r0,r7,LSL #2 dau tien cua hang thu i ; r7 = &matrix[0] + * r7 = &a[i][0] - phan tu LDR r4,[r7,r6,LSL #2] MOV r8, #2 MUL r4, r4, r8 ; r4 = a[i][j] ; a[i][j] = 2*a[i][j]; STR r4,[r7,r6,LSL #2] ; luu vao bo nho a[i][j] ADDS ; j++ r6,r6,#1 check_j CMP r6,r2 ; so sanh j voi so luong cot BLT loop_j ; for(j = 0; j < 3; j++) ADDS r5,r5,#1 ; neu j >= thi i++ check_i CMP r5,r1 BLT ; so sanh i voi so hang loop_i stop ; for(i = 0; i < 4; i++) B stop ; dead loop & program hangs here; ENDP ALIGN AREA myData, DATA, READWRITE ALIGN matrix DCD 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43 ; moi phan tu 32 bit - ma tran 4-3 row DCD col DCD END 6.16 MatrixTranspose Đề : Viết chương trình asm chuyển chuyển vị ma trận xác định trước Chương trình asm phải có hai vòng lặp Ma trận [aij] m*n chuyển đổi thành [aij] n*m Code: INCLUDE stm32l1xx_constants.s ; Load Constant Definitions INCLUDE stm32l1xx_tim_constants.s ; TIM Constants AREA main, CODE, READONLY EXPORT main ; make main visible to linker ENTRY main PROC LDR r0, =matrix BL transpose stop B ; &p stop ENDP transpose PROC PUSH {r4-r7, lr} MOV r1, #0 ;i=0 loop_i CMP r1, #4 BGE exit_i ADD r2, r1, #1 loop_j CMP ;j=i+1 r2, #3 BGE exit_j ; *p = &matrix[0][0] ; r4 = p + (3*i + j)*4 - r4 chua dia chi cua phan tu a[i][j] ADD r4, r1, r1, LSL #1 ; r4 = 3*i ADD r4, r0, r4, LSL #2 ; 4*r4 + p = 4*3*i + p ADD r4, r2, LSL #2 ; 4*3*i + p + 4*j = (3i +j)*4 + p ; r5 = p + (3*j + i)*4 - r5 chua dia chi cua phan tu a[j][i] ;ADD r5, r2, r2, LSL #1 ; r5 = 3*j MOV r5, r2, LSL #2 ; r5 = 4*j ADD r5, r0, r5, LSL #2 ; 4*r5 + p = 4*4*j + p ADD r5, r1, LSL #2 ; 4*4*j + p + 4*i = 4(4j + i ) + p ;swap LDR r6, [r4] LDR r7, [r5] STR r7, [r4] STR r6, [r5] ADD r2, r2, #1 B loop_j exit_j B exit_i ADD r1, r1, #1 POP {r4-r7, lr} loop_i ENDP AREA myData, DATA, READWRITE ALIGN matrix END DCD 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43 ... 4, 5, 6, 7, 8, 9, 10 ; moi phan tu 32 bit END 6. 4 TheSumCube –Tổng lập phương Đề : Xác định mảng 10 số nguyên không dấu (