Tải bản đầy đủ (.pdf) (30 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (509.62 KB, 30 trang )

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 7 SÁCH (Có code đính kèm)
71_ChuyenSangChuHoa
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 = 4

LDR r3, =col
LDR r2, [r3]

; so luong cot = 4


MOVS

r5,#0

B

check_i

;i=0

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] + 4 * r7 = &a[i][0] - phan tu

LDR r4,[r7,r6,LSL #2]

; r4 = a[i][j]

MOV

r8,r0

; a[0][0] = 0

;MOV

r8, #2


;MUL

r4, r4, r8

; 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 >= 3 thi i++


check_i
CMP r5,r1
BLT

; so sanh i voi so hang
loop_i

; for(i = 0; i < 4; i++)


stop

B

stop

; dead loop & program hangs here;

ENDP
ALIGN

AREA

myData, DATA, READWRITE

ALIGN
matrix

DCD

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
; moi phan tu 32 bit - ma tran 4-3

row

DCD

4

col

DCD 4

END
72_BoiChungNhoNhat
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 = result, r1 = a, r2 = b, r3 = temp, r4 = a*b, r5 = t = r2, r6 = so du r
MOV r1, #3
MOV

;a=3
r2, #7

;b=7


; Doi vi tri neu r1 < r2
CMP r1, r2

; so sanh a va b

MOVLT

r3, r1

; temp = a

MOVLT


r1, r2

;a=b

MOVLT

r2, r3

; b = temp

MUL r4, r1, r2

loop
CBZ

; r4 = a*b

MOV

r5, r2

r2, lcm

;t=b
; b = 0 vao lcm

UDIV r6, r1, r2

; kq = a/b


MLS

; sodu = a - b*kq

r6, r2, r6, r1

MOV r2, r6

; b = sodu

MOV

r1, r5

B

loop

;a=t

lcm

UDIV r0, r4, r1

LDR

r7, =result

STR


r0, [r7]

stop
ENDP
ALIGN

B

; lcm = (a*b)/gcd

;

stop

; dead loop & program hangs here


AREA

myData, DATA, READWRITE

ALIGN
result

DCD

0

END
73_LuyThuaXY


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 = x, r1 = y, r2 = i
MOV

r0, #2

;x=2


MOV

r1, #-2

;y=3

MOV

r2, #0

;i=0

MOV

r3, #1

LDR r4, =raise
CMP

r1, #0

BGT

y_duong

BLT

y_am



y_duong
CMP

r2, r1

BGE

stop

MUL

r3, r3, r0

ADD

r2, #1

STR

r3, [r4]

B

y_duong

; i++

y_am
CMP


r2, r1

BGE

stop

SDIV r3, r3, r0
ADD

r2, #1

STR

r3, [r4]

B

y_am

stop

; i++

B

stop

ENDP
ALIGN


AREA myData, DATA, READWRITE
ALIGN
raise

DCD

0

; dead loop & program hangs here


END
74_NamNhuan
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 = flag, r1 = nam, r2 = 400, r3 = 4 , r4 = 100, r5 = so du
MOV

r1, #2100

; num = 2012

MOV r2, #400

;i=1

MOV

r3, #4

;

MOV

r4, #100

;

UDIV r5, r1, r2


;

MLS

r5, r2, r5, r1

; so du = num - r5*i

CBZ

r5, yes

UDIV r5, r1, r3

;

MLS

; so du = num - r5*i

CMP r5, #0

r5, r3, r5, r1


BNE
nhuan

no


; neu khong chia het cho 4 thi khong phai nam

; Nam chia het cho 4
UDIV r5, r1, r4

;

MLS

; so du = num - r5*i - khong chia het cho 100

r5, r4, r5, r1

CMP r5, #0
BNE
yes
thi la nam nhuan

; neu chia het cho 4 va khong chia het cho 100

BEQ
no
phai nam nhuan

; neu chia het cho 4 va chia het cho 100 thi ko

yes
B

MOV

stop

no

stop

r0, #1 ; set co flag len 1 - la nam nhuan

MOV

B

r0, #0

stop

; khong phai la nam nhuan

; dead loop & program hangs here

ENDP
ALIGN

END
75_RemoveVowelLetter
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 = giatri, r1 = =str
; signed number

LDR r1, =str
loop

; r1 = &str
LDRB r0, [r1]

; nap 1 byte

CBZ


r0, endloop

; dung neu str[i = 0

CMP

r0, #'a'

; so sanh str[i] voi voi a

MOVEQ

r0, #0x00

; xoa neu ky tu la a

STRB r0, [r1]

; luu gia tri r0 1 byte vao bo nho

BEQ

next

; vao next neu str[i] = a

CMP

r0, #'e'


MOVEQ

r0, #0x00

STRB r0, [r1]
BEQ

next

CMP

r0, #'i'

MOVEQ

r0, #0x00

; vao next neu str[i] = e

STRB r0, [r1]
BEQ

next

; vao next neu str[i] = i


CMP


r0, #'o'

MOVEQ

r0, #0x00

STRB r0, [r1]
BEQ

next

CMP

r0, #'u'

MOVEQ

r0, #0x00

; vao next neu str[i] = o

STRB r0, [r1]
BEQ

next

CMP

r0, #'A'


MOVEQ

r0, #0x00

; vao next neu str[i] = u

STRB r0, [r1]
BEQ

next

CMP

r0, #'E'

MOVEQ

r0, #0x00

; vao next neu str[i] = A

STRB r0, [r1]
BEQ

next

CMP

r0, #'I'


MOVEQ

r0, #0x00

; vao next neu str[i] = E

STRB r0, [r1]
BEQ

next

CMP

r0, #'O'

MOVEQ

r0, #0x00

; vao next neu str[i] = I

STRB r0, [r1]
BEQ

next

; vao next neu str[i] = O


CMP


r0, #'U'

MOVEQ

r0, #0x00

STRB r0, [r1]
BEQ

next

; vao next neu str[i] = U

STRB r0, [r1]

; luu gia tri r0 1 byte vao bo nho

next
ADD

r1, #1

B

loop

; &str += 1

endloop

stop

B

stop

; dead loop & program hangs here

ENDP
ALIGN

AREA

myData, DATA, READWRITE

ALIGN
str

DCB

"Arm-Cortex M3", 0

; mang ky tu
END
76_SoDuBangNhau
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 = 4

LDR r3, =col

LDR r2, [r3]

; so luong cot = 4

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
cua hang thu i

; r7 = &matrix[0] + 4 * r7 = &a[i][0] - phan tu dau tien

LDR r4,[r7,r6,LSL #2]

; r4 = a[i][j]

MOV

r8,r0

; a[0][0] = 0


;MOV

r8, #2

;MUL

r4, r4, r8

; 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 >= 3 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
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
; moi phan tu 32 bit - ma tran 4-3

row

DCD

col

DCD 4

END


4


77_Prime
INCLUDE stm32l1xx_constants.s

; Load Constant Definitions

INCLUDE stm32l1xx_tim_constants.s ; TIM Constants

AREA

prime, CODE, READONLY

EXPORT

__main

; make __main visible to linker

ENTRY

__main

PROC

;r0 = flag, r1 = num, r2 = i, r3 = so du
MOV


r1, #7

; num = 15

MOV r2, #2

;i=2

CMP r1, #1
BEQ

no

loop

CMP r2, r1

; so sanh i voi num

BHS yes

; neu i >= num thi nhay ra 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
; la so nguyen to neu so du #0

ADDNE
BNE loop

r2, r2, #1

; i += 1


yes

MOV

r0, #1

; set co flag len 1 - la so nguyen to

no

MOV

r0, #0


; khong phai la so nguyen to

stop

B

stop

; dead loop & program hangs here

B

stop

ENDP
ALIGN

END
78_Reverses32Bit

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 = 4


LDR r3, =col
LDR r2, [r3]

; so luong cot = 4


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
cua hang thu i

; r7 = &matrix[0] + 4 * r7 = &a[i][0] - phan tu dau tien


LDR r4,[r7,r6,LSL #2]

; r4 = a[i][j]

MOV

r8,r0

; a[0][0] = 0

;MOV

r8, #2

;MUL

r4, r4, r8

; 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 >= 3 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
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
; moi phan tu 32 bit - ma tran 4-3

row

DCD

col

DCD 4

4

END
79_SoChinhPhuong
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 = flag, r1 = num, r2 = i , r3 = i*i
MOV

r1, #20

; num = 15

MOV r2, #2


;i=1

loop

CMP r2, r1

BHS no

; so sanh i voi num
; neu i >= num thi nhay ra ngoai

MUL

r3, r2, r2

; r3 = i*i

CMP

r3, r1

; so sanh i*i voi num

MOV

r0, #1

; la so nguyen to neu so du #0


BEQ

yes

; i*i = num thi nhay vao yes

ADDNE

r2, r2, #1

; i += 1

BNE loop
yes

MOV

r0, #1

; set co flag len 1 - la so chinh phuong

B

stop

no

MOV

r0, #0


; khong phai la so chinh phuong

stop

B

stop

; dead loop & program hangs here

ENDP
ALIGN

END
710_SoTuTrongChuoi
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 = giatri, r1 = =str, r2 = count
; signed number
MOV r2, #1

; count = 1

LDR r1, =str

; r1 = &str

loop

LDRB

r0, [r1]

; nap 1 byte

CBZ


r0, endloop

; dung neu str[i = 0

CMP

r0, #0x20

; so sanh str[i] voi ma ascii cua space

ADDEQ

r2, #1

; count += 1 neu str[i] = space

ADD

r1, #1

; &str += 1

B

loop

endloop
stop

ENDP

ALIGN

B

stop

; dead loop & program hangs here


AREA

myData, DATA, READWRITE

ALIGN
str

DCB

"Dai hoc Da Nang", 0

; mang ky tu
END
711_NgayTrongTuan
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 = 4

LDR r3, =col
LDR r2, [r3]

; so luong cot = 4


MOVS

r5,#0

;i=0

B

check_i


loop_i
MOVS

r6,#0

;j=0

B

check_j

loop_j
MUL r7,r5,r2

; r7 = i * so luong cot

ADD r7,r0,r7,LSL #2
cua hang thu i


; r7 = &matrix[0] + 4 * r7 = &a[i][0] - phan tu dau tien

LDR r4,[r7,r6,LSL #2]

; r4 = a[i][j]

MOV

r8,r0

; a[0][0] = 0

;MOV

r8, #2

;MUL

r4, r4, r8

; 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 >= 3 thi i++

check_i
CMP r5,r1
BLT
stop

ENDP

; so sanh i voi so hang
loop_i

; for(i = 0; i < 4; i++)
B


stop

; dead loop & program hangs here;


ALIGN

AREA

myData, DATA, READWRITE

ALIGN
matrix

DCD
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
; moi phan tu 32 bit - ma tran 4-3

row

DCD

4

col

DCD 4

END

712_Variance_PhuongSai
INCLUDE stm32l1xx_constants.s

; Load Constant Definitions

INCLUDE stm32l1xx_tim_constants.s ; TIM Constants

AREA

variance, CODE, READONLY

EXPORT

__main

; make __main visible to linker

ENTRY

__main

PROC

; r0 = i, r1 = sum, r2 = &array[0], r3 = n- kich thuoc mang, r4 = =n, r5 = array[i] ; kq R8
= 8.5
MOV r0, #0

;i=0

MOV r1, #0


; sum = 0

MOV

r7, #0

LDR r2, =array
array

; var*size = 0
; r2 = &array[0] - r2 chua dia chi tham chieu cua bien


LDR r4, =n

; r4 = &n

LDR r3, [r4]

; r3 = n = 10

loop_mean

CMP r0, r3 ; so sanh i voi kich thuoc mang

BEQ mean

; i = 10 thi vao mean


LDR r5, [r2]

; nap array[i] vao r5

ADD r1, r5

; sum += array[i]

ADD r0, #1

; i += 1

ADD r2, #4

; i += 1 r2 chua dia chi tiep theo cua array

B

loop_mean

mean
UDIV r6, r1, r3

MOV

; mean = sum/n - tinh trung binh cong

r0, #0

LDR r2, =array

array

; r2 = &array[0] - r2 chua dia chi tham chieu cua bien

loop_var
CMP

r0, r3

BEQ var
LDR r5, [r2]

; nap array[i] vao r5

SUB

r1, r5, r6

; r1 = array[i] - mean

MLA

r7, r1, r1, r7

; var*size = (array[i] - mean)^2 + var*size

ADD r0, #1

; i += 1


ADD r2, #4

; i += 1 r2 chua dia chi tiep theo cua array


B

loop_var

var
UDIV r8, r7, r3

; var = r7/n

LDR

r0, =vari

STR

r8, [r0]

stop

B

stop

; dead loop & program hangs here;de xem bo nho


ENDP
ALIGN

AREA

myData, DATA, READWRITE

ALIGN
array

DCD

n

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

; moi phan tu 32 bit

DCD 10

vari

DCD 0

END
713_TongDuongCheo
INCLUDE stm32l1xx_constants.s

; Load Constant Definitions


INCLUDE stm32l1xx_tim_constants.s ; TIM Constants

AREA

main, CODE, READONLY

EXPORT
ENTRY

__main

; make __main visible to linker


__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 = 4

LDR r3, =col

LDR r2, [r3]

; so luong cot = 4

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
cua hang thu i

; r7 = &matrix[0] + 4 * r7 = &a[i][0] - phan tu dau tien

LDR r4,[r7,r6,LSL #2]

; r4 = a[i][j]

MOV

r8,r0

; a[0][0] = 0

;MOV

r8, #2

;MUL

r4, r4, r8

; a[i][j] = 2*a[i][j];


×