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.
Trang 1LẬ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 )
BGT done MUL r2, r1, r2 ADD r1, r1, #1
B loop done MOV r0, r2
Trang 2n = result;
while(1);
}
6.3 Mean –Trung bình cộng
Đề : Define an array with 10 unsigned integers in asemply code and write an
assemply program that calculated the mean of these 10 integers (truncating the result to an integer)
Xác định một mảng gồm 10 số nguyên không dấu trong code asemply va viết một chương trình asm để tính trung bình cộng của 10 số đó (kết quả là một số nguyên)
Code:
INCLUDE stm32l1xx_constants.s ; Load Constant Definitions
INCLUDE stm32l1xx_tim_constants.s ; TIM Constants
AREA main, CODE, READONLY
loop CMP r0, r3 ; so sanh i voi kich thuoc mang
Trang 3LDR r5, [r2] ; nap array[i] vao r5
stop B stop ; dead loop & program hangs here;
Đề : Xác định một mảng 10 số nguyên không dấu ai ( 0 <= i <= 9 ) bàng code
assemply, viết một chương trình asm tính tổng lập phương của 10 số không dấu đó Mảng này được xác định trong bộ nhớ dữ liệu sau:
AREA myData, DATA
array DCD 2, 4, 7, 3, 1, 2, 10, 11, 5, 13
Trang 4array DCD 10
Code:
INCLUDE stm32l1xx_constants.s ; Load Constant Definitions
INCLUDE stm32l1xx_tim_constants.s ; TIM Constants
AREA main, CODE, READONLY
LDR r5, [r4, r2, LSL #2] ; array[i]; dich trai r2 2 bit = 4*i +&array[0]
MLA r1, r0, r5, r1 ; result = sum + array[i] ^3 - phep cong don
Trang 5STR r1, [r6] ; luu ket qua vao bo nho
array DCD 2, 4, 7, 3, 1, 2, 10, 11, 5, 13 ; khai bao mang 10 so
END
6.5 UpperCase- Chuyển thành chữ hoa
Đề: Viết chương trình asm chuyển từ ký tự thường sang ký tự hoa
Code:
INCLUDE stm32l1xx_constants.s ; Load Constant Definitions
INCLUDE stm32l1xx_tim_constants.s ; TIM Constants
AREA main, CODE, READONLY
ENTRY
Trang 6; r0 = giatri, r1 = =str
; signed number
next ADD r1, #1 ; &str += 1
Trang 76.6 TheKineticEnergy- E =mC^2
Đề: Viết một chương trình asm tính năng lượng (E) , E = MC 2 , khi mà khối lượng (M) là 15 kg và được lưu trong r0, C là tốc độ ánh sáng (299,792,458 m/s), và được chứa trong r1 Kết quả E lưu trong thanh ghi 32 bit r2
Code:
INCLUDE stm32l1xx_constants.s ; Load Constant Definitions
INCLUDE stm32l1xx_tim_constants.s ; TIM Constants
AREA main, CODE, READONLY
stop B stop ; dead loop & program hangs here
ENDP
ALIGN
Trang 8AREA myData, DATA, READWRITE
Code:
INCLUDE stm32l1xx_constants.s ; Load Constant Definitions
INCLUDE stm32l1xx_tim_constants.s ; TIM Constants
AREA main, CODE, READONLY
Trang 9MLA r0, r5, r8, r0 ; result = 3x/y + 9xy + 7x^2 + 5
MLA r0, r6, r1, r0 ; result = 11x + 3x/y + 9xy + 7x^2 + 5
MLA r0, r7, r2, r0 ; result = 13y + 11x + 3x/y + 9xy + 7x^2 + 5
6.8 QuadraticEquation –Phương trình bậc hai
Đề : Kiểm tra nghiệm số phức trong lời giải của phương trình bậc hai sau :
Trang 10ax 2 + bx + c = 0 Lời giải có nghiệm phức nếu b 2 - 4ac nhỏ hơn 0 và là nghiệm thực với những
trường hợp còn lại Giả sử a, b, c là những số nguyên có dấu và được lưu lần lượt rong các thanh ghi r0, r1, r2 Viết một chương trình asm thiết lập thanh ghi r3 lên 1 nếu kết quả là nghiemj phức và 0 với trường hợp còn lại
Code:
INCLUDE stm32l1xx_constants.s ; Load Constant Definitions
INCLUDE stm32l1xx_tim_constants.s ; TIM Constants
AREA quadraticEquation, CODE, READONLY
Trang 11CMP r5, #0 ; so sanh delta voi 0
MOVGE r3, #2 ; delta >= 0 flag set 0 - hay real roots - nghiem thuc
Code:
INCLUDE stm32l1xx_constants.s ; Load Constant Definitions
INCLUDE stm32l1xx_tim_constants.s ; TIM Constants
AREA main, CODE, READONLY
ENTRY
Trang 13
Code:
INCLUDE stm32l1xx_constants.s ; Load Constant Definitions INCLUDE stm32l1xx_tim_constants.s ; TIM Constants
AREA main, CODE, READONLY
Trang 14stop B stop ; dead loop & program hangs here
Code:
INCLUDE stm32l1xx_constants.s ; Load Constant Definitions
INCLUDE stm32l1xx_tim_constants.s ; TIM Constants
AREA main, CODE, READONLY
Trang 15elseif CMP r1,r0 ; kiem tra b < a
program hangs here
ENDP
ALIGN
AREA myData, DATA, READWRITE
Trang 16AREA, 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
Trang 17MOVLO r0, #1 ; LO = unsigned on Lower - nam 1 truoc nam 2 thi set r0 len 1
2 thi set r0 len 1
2 thi set r0 len 1
len -1
Trang 18stop B stop ; dead loop & program hangs here
INCLUDE stm32l1xx_constants.s ; Load Constant Definitions
INCLUDE stm32l1xx_tim_constants.s ; TIM Constants
AREA main, CODE, READONLY
ENTRY
Trang 19MOV r0, #4 ; n = 4
Đề : Viết chương trình asm tính tổng giai thừa của một số nguyên không âm Giả sử
n được cho bởi thanh ghi r0 và kết quả được lưu trong thanh ghi r1
Code:
INCLUDE stm32l1xx_constants.s ; Load Constant Definitions
Trang 20INCLUDE stm32l1xx_tim_constants.s ; TIM Constants
AREA factorial, CODE, READONLY
Trang 216.15 2Dmatrix
Đề : Khi một ma trận 2 chiều (2D) được khai báo trong chương trình C Ma trận trong thực tế được lưu trong một mảng một chiều trong bộ nhớ Chương trình C sử dụng một cách tiếp cận theo hàng để chuyển đổi ma trận hai chiều thành mảng một chiều Ví dụ sau đây là cách lưu trữ một ma trận 3*3 trong bộ nhớ
INCLUDE stm32l1xx_constants.s ; Load Constant Definitions
INCLUDE stm32l1xx_tim_constants.s ; TIM Constants
Trang 22AREA main, CODE, READONLY
ADD r7,r0,r7,LSL #2 ; r7 = &matrix[0] + 4 * r7 = &a[i][0] - phan tu dau tien cua hang thu i
Trang 23LDR r4,[r7,r6,LSL #2] ; r4 = a[i][j]
STR r4,[r7,r6,LSL #2] ; luu vao bo nho a[i][j]
stop B stop ; dead loop & program hangs here;
Trang 246.16 MatrixTranspose
Đề : Viết chương trình asm chuyển chuyển vị ma trận xác định ở bài 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
Trang 25ADD 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]
Trang 26ENDP
AREA myData, DATA, READWRITE
ALIGN
matrix DCD 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43 END