1. Trang chủ
  2. » Công Nghệ Thông Tin

Lập trình vi điều khiển chip STM32L152 bài tập chương 8 sách Embedded Systems with ARM CortexM Microcontrollers in Assembly Language and C (Third Edition – Dr Yifeng Zhu)

30 472 11

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Bài tập có lời giải và code đính kèm chương 8 sách Embedded Systems with ARM CortexM Microcontrollers in Assembly Language and C (Third Edition – Dr Yifeng Zhu ), gồm những bài tập: Viết các chương trình con: xác định các số nguyên tố, mã hóa caeser, bài toán tính giá vé xem phim, tính tổng giai thừa, tìm số lượng bit khác, tìm phần tử duy nhất trong mảng, tính giá trị biểu thức phương trình bậc hai, fibonaci, xác định số đối xứng (palindrome), tính lũy thừa của 2.

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 ) BÀI TẬP CHƯƠNG CHƯƠNG TRÌNH CON (Code đính kèm) 81_SoNguyenTo Đề: Viết chương trình kiểm tra thử xem số đưa vào có phải số ngun tố hay khơng ? Chương trình nhận tham số trả sai Tìm tất số nguyên tố khoảng từ 100 đến 200 ? Code: INCLUDE stm32l1xx_constants.s ; Load Constant Definitions INCLUDE stm32l1xx_tim_constants.s ; TIM Constants AREA main, CODE, READONLY EXPORT linker main ; make main visible to ENTRY main PROC ;r0 = flag, r1 = num, r2 = i, r3 = so du ;MOV r1, #100 LDR r4, =array MOV r1, #100 loop_ CMP ; num = 100 r1, #200 BGT stop BL pri CMP r0, #1 STREQ r1, [r4] ADDEQ r4, #4 ; dia chi tang byte ADD r1,r1,#1 ; j++ B loop_ stop B program hangs here stop ; dead loop & ENDP pri PROC MOV r2, #2 ;i=2 CMP r1, #1 BEQ no loop CMP r2, r1 BHS yes ; so sanh i voi num ; neu i >= num thi nhay ngoai UDIV r3, r1, r2 ; r4 = num/i MLS ; sodu = num -(r4*i) r3, r2, r3, r1 CBZ r3, no ; so sanh so du voi r0, #1 ADDNE ; la so nguyen to neu so du #0 r2, r2, #1 ; i += BNE loop yes MOV BX r0, #1 ; set co flag len - la so nguyen to lr no la so nguyen to BX MOV r0, #0 ; khong phai lr ENDP ALIGN AREA myData, DATA, READWRITE ALIGN array DCD END 81_SoNguyenTo_1 INCLUDE stm32l1xx_constants.s ; Load Constant Definitions INCLUDE stm32l1xx_tim_constants.s ; TIM Constants AREA main, CODE, READONLY EXPORT linker main ; make main visible to ENTRY main PROC ; r1 = , r2 = , r3 = , r4 = , r5 = , r6 = LDR r6, =t MOV r1, #99 lap ADD r1, #1 ; r1++ CMP r1, #200 BGT stop BL ; r1>200 break; check ; call check CMP r5, #1 BNE lap ; r1 khong la snt STR r1, [r6], #4 B ; la so nguyen to , luu vao r6 lap stop ; continue B stop ENDP check PROC MOV r2, r1 LSR r2, #1 ; r2 = r1/2 MOV r3, #2 ; r3 -> (2,r2) loop CMP r3, r2 BGT snt ; if(r3 > r2) la so nguyen to UDIV r0, r1, r3 MUL r0, r0, r3 ; r0 = r1/r3 ; r0 *= r3 SUB r0, r1, r0 ; r0 = r0-r3; tim so du cua phep chia r1/r3 CMP r0, #0 ; if(r0 == 0) khong la so nguyen to BEQ ksnt ADD r3, #1 B ; r3++ loop snt MOV r5, #1 B ; r5 = stop1 ksnt MOV r5, #0 ; r5 = stop1 BX lr ENDP ALIGN AREA myData, DATA, READWRITE ALIGN t DCD END 82_8Argument Đề: Viết chương trình nhận đối số ngun tính sản phẩm số nguyên Lưu ý đối số thừa nên chuyển đến chương trình thông qua ngăn xếp ? Code: INCLUDE stm32l1xx_constants.s ; Load Constant Definitions INCLUDE stm32l1xx_tim_constants.s ; TIM Constants AREA main, CODE, READONLY EXPORT linker main ; make main visible to ENTRY main mov r1, #3 push {r1} mov r1, #4 push {r1} mov r1, #5 push {r1} mov r1, #6 push {r1} mov r1, #7 push {r1} mov r1, #8 PROC push {r1} mov r1, #9 push {r1} mov r1, #2 push {r1} bl computes stop b endp computes proc mov r0, #1 pop {r1} mul r0,r0,r1 pop {r1} mul r0,r0,r1 pop {r1} mul r0,r0,r1 pop {r1} mul r0,r0,r1 stop pop {r1} mul r0,r0,r1 pop {r1} mul r0,r0,r1 pop {r1} mul r0,r0,r1 pop {r1} mul r0,r0,r1 stop1 bx lr endp AREA myData, DATA, READWRITE ALIGN t array dcd dcd 2,3,4,5,6,7,8,9 END 83_MaHoaCaeserShift Đề: Triển khai chương trình mã hóa Caeser shift Đó loại mã hóa đơn giản với ký tự thay ký tự khác (có nguyên tắc thay thế) bảng chữ dụ với đoạn dịch chuyển 3, chữ A thành chữ D, chữ B thành chữ E… Code: INCLUDE stm32l1xx_constants.s ; Load Constant Definitions INCLUDE stm32l1xx_tim_constants.s ; TIM Constants AREA main, CODE, READONLY EXPORT linker main ; make main visible to ENTRY main PROC LDR r0, =st BL encryption stop B ENDP encryption PROC loop LDRB r1,[r0] CMP r1, #0 BEQ stop1 ADD r1, #3 CMP r1, #128 BLT tiep MOV r1, #'c' tiep STRB r1,[r0] stop ADD r0,#1 B loop stop1 BX lr ENDP AREA myData, DATA, READWRITE ALIGN st DCB "ABC",0 END 84_GiaVeXemPhim Đề: Viết chương trình gọi GiaVeXemPhim tính giá vé xem phim dựa vào tham số truyền vào độ tuổi Nếu tuổi nhỏ 12, giá vé 6$, tuổi lớn 13 bé 64 giá vé 8$, lớn 65 giá vé 7$… Code: INCLUDE stm32l1xx_constants.s ; Load Constant Definitions INCLUDE stm32l1xx_tim_constants.s ; TIM Constants AREA main, CODE, READONLY EXPORT linker main ; make main visible to ENTRY main MOV r0, #15 PROC ; so tuoi MUL r0, r0, r2 ; a *= j ADD r2, #1 B loop2 stop2 MOV r3, r0 ; r3 = a! POP{r0, r1, r2} BX lr ENDP ALIGN AREA myData, DATA, READWRITE ALIGN END 87_SoLuong1Bit Đề: Viết chương trình sử dụng chương trình để tìm có bits tồn số 32 bits Code: INCLUDE stm32l1xx_constants.s ; Load Constant Definitions INCLUDE stm32l1xx_tim_constants.s ; TIM Constants AREA main, CODE, READONLY EXPORT linker ENTRY main ; make main visible to main PROC MOV r0, #12 ; a = 12 BL findBit1 stop B stop ENDP findBit1 PROC PUSH {lr} MOV r3, #0 ; dem = loop ; while(a > 0) CMP r0, #0 BEQ stop1 MOV r1, r0 LSR r1, #1 ; b = (int) a/2 ; r1 = r1/ 2^1 ADD r1, r1, r1 ; b *= SUB r2, r0, r1 ;c=a-b CMP r2, #0 ; c == countinue while BEQ skip ADD r3, #1 ; else dem++ skip LSR r0, #1 B stop1 loop POP {pc} ;BX lr ENDP ALIGN AREA myData, DATA, READWRITE ALIGN END 88_SoLuongBitKhac Đề: Viết chương trình sử dụng chương trình để tìm có số lượng bits khác số 32 bits Code: INCLUDE stm32l1xx_constants.s ; Load Constant Definitions INCLUDE stm32l1xx_tim_constants.s ; TIM Constants AREA main, CODE, READONLY EXPORT linker main ; make main visible to ENTRY main PROC LDR r0, =10 LDR r1, =5 BL stop bits_differ B stop ENDP bits_differ PROC PUSH {r4,lr} MOV r4, #0 loop CMP r0,#0 BNE skip1 CMP r1,#0 BEQ stop1 skip1 LSR r2, r0, #1 ; a1=a/2 ADD r2,r2,r2 ; a1=2*a1 SUB r2,r0,r2 ; a1=a-a1 (=0 or =1) LSR r0,r0,#1 LSR r3, r1, #1 ; a1=a/2 ADD r3,r3,r3 ; a1=2*a1 SUB r3,r1,r3 ; a1=a-a1 (=0 or =1) LSR r1,r1,#1 CMP BEQ skip ADD r4,#1 r2,r3 skip B loop stop1 MOV r0,r4 POP {r4,pc} ENDP ALIGN AREA myData, DATA, READWRITE ALIGN END 89_UniqueElement Đề: Cardinality (bản số) mảng xác định số lượng phần tử mảng số Viết chương trình tính cardinality mảng số ngun Code: INCLUDE stm32l1xx_constants.s ; Load Constant Definitions INCLUDE stm32l1xx_tim_constants.s ; TIM Constants AREA main, CODE, READONLY EXPORT linker ENTRY main ; make main visible to main BL PROC func stop B stop ENDP func PROC PUSH {lr} LDR r0, LDR r1, =size LDR r1, [r1] MOV r2, #0 MOV r5, =array ; dua dia chi mang vao r0 ; n=10 ; i=0 #0 ; dem=0 loop CMP r2, ; for(i=0; i r3,r2,r1,r0 BNE skip ; if(check()) countinue, jump skip ADD r5, #1 ; else dem++ skip ADD r2,#1 ; i++ in for( , , ) B loop BX lr ;co the xai pop{pc} ENDP check PROC PUSH {r0,r1,r2,r3,r5} MOV ; check(a,i,n,A[]) < -> r3,r2,r1,r0 ; luu cac gia tri vao ngan xep r4,#0 ; dem1=0 MOV r5, #0 ;r5=j loop1 ; for(int j=0; j

Ngày đăng: 18/01/2018, 14:54

Xem thêm:

TỪ KHÓA LIÊN QUAN

w