Professional Documents
Culture Documents
2 Exercises SE1401
2 Exercises SE1401
For all exams, you should make use of the Beta documentation and you can use the Bsim (Beta simulator) to
verify the exams.
Cơ bản:
1. Đổi chỗ 2 phần từ mảng a[1] và a[3].
2. Viết chương trình thực hiện phép tính: a[0]=a[1]+a[2]
3. Chia a[0] cho a[1], phần nguyên lưu vào a[2], phần dư lưu vào a[3].
4. Cho a[0] lưu giá trị số phút. Chuyển đổi số phút trên thành giờ lưu vào a[1] và phần dư phút lưu vào a[2].
(Ví dụ: a[0] = 125 thì a[1]=2 và a[2]=5).
5. Cho a[0] lưu giá trị số giây. Chuyển đổi số phút trên thành giờ lưu vào a[1] và phần dư phút lưu vào a[2]
và phần dư giây lưu vào a[3]. (Ví dụ: a[0] = 3745 thì a[1]=1 và a[2]=2 và a[3]=25 = 0x19).
6. Đếm số digit ‘1’ trong giá trị a[0]. Kết quả lưu vào a[1].
7. Nếu a[1] > a[3] thì đổi chỗ
8. Tìm giá trị nhỏ nhất của a[0], a[1] và a[2], kết quả lưu vào a[3].
9. Tìm giá trị lớn nhất của a[0], a[1] và a[2], kết quả lưu vào a[3].
10. Kiếm tra xem a[0], a[1] và a[2] có phải là độ dài của 3 cạnh tam giác hay không. Nếu đúng lưu 1 vào a[3],
ngược lại lưu 0.
11. Sắp xếp a[0], a[1] và a[2] theo thứ tự tăng dần.
12. Sắp xếp a[0], a[1] và a[2] theo thứ tự giảm dần.
Nâng cao:
13. Tính tổng s = 1 + 2 + … + a[0] và lưu vào thanh ghi r0.
14. Tính tổng các phần tử mảng a[0] đến a[9] và lưu vào a[10].
15. Tìm số lớn nhất của các phần tử mảng a[0] đến a[9] và lưu vào a[10].
16. Tìm ước số chung lớn nhất của a[0] và a[1] lưu vào a[2].
17. Tìm bội số chung nhỏ nhất của a[0] và a[1] lưu vào a[2].
18. Xác định a[0] có phải là số nguyên tố không? Nếu có ghi 1 vào a[1], ngược lại ghi 0.
19. Tìm số nguyên tố nhỏ nhất lớn hơn a[0], kết quả lưu vào a[1]. (ví dụ a[0]=8 thì a[1]=11).
20. Xác định a[0] có phải là số chính phương không không? Nếu có ghi 1 vào a[1], ngược lại ghi 0.
21. Sắp xếp mảng a tăng dần dùng giải thuật nổi bọt (bubble sort).
22. Sắp xếp mảng a tăng dần dùng giải thuật chọn (selection sort).
2
Problem 1:
/* Khai bao mảng
Load (LD): Giá trị trong ô nhớ tải vào thanh ghi
Store (ST): Giá trị trong thanh ghi lưu vào ô nhớ
.include "beta.uasm"
// Viết code vào đây
HALT()
a: LONG(9) // a[0] – Address a
LONG(2) // a[1] – Address a+4 = a+4*1
LONG(0) // a[2] – Address a+8 = a+4*2
LONG(4) // a[3] – Address a+12 = a+4*3
LONG(5) // …
Problem 2:
.include "beta.uasm"
// Viết code vào đây
HALT()
Problem 3:
// Đề bài: Nếu a[1] > a[3] thì đổi chỗ
.include "beta.uasm"
HALT()
a: LONG(9) // a[0] – Address a
LONG(2) // a[1] – Address a+4 = a+4*1
LONG(0) // a[2] – Address a+8 = a+4*2
LONG(4) // a[3] – Address a+12 = a+4*3
LONG(5) // a[4] - …
3
Program :
.include "beta.uasm"
ADDC(r31,5,r0) // r0=5
ADDC(r31,7,r1) // r1=7
ADD(R0, R31, R2) // R2=R0
ADD(R1, R31, R0) // R0=R1
ADD(R2, R31, R1) // R1=R2
HALT()
Program :
.include "beta.uasm"
ADDC(r31,125,r0) // r0=125 phút
DIVC(r0,60,r1) // r1=r0/60
MULC(r1,60,r3) // r3=r1*60
SUB(r0,r3,r2) // r2=r0-r3
HALT()
Program :
// tìm giá trị nhỏ nhất của r1, r2 và r3 - lưu kết quả vào r0
.include "beta.uasm"
ADDC(r31,5,r1) // r1=5
ADDC(r31,3,r2) // r2=3
ADDC(r31,8,r3) // r3=8
CMPLT(r3,r0,r10)
BNE(r10,TH2,r20)
BR(ket_thuc) // Nhay den ket_thuc
TH1:
ADDC(r2,0,r0)
BR(SS2)
TH2:
ADDC(r3,0,r0)
ket_thuc:
HALT()
Program :
.include "beta.uasm"
ADDC(r31,8,r0)
ADDC(r31,7,r1)
ADDC(r31,5,r2)
SS1:
CMPLT(r1,r0,r10) // nếu r1<r0 thì r10=1.
BNE(r10,swap1,r31) // nếu r10 khác 0 thì nhảy đến swap1
// BR(SS2)
SS2:
CMPLT(r2,r0,r10)
BNE(r10,swap2,r31)
// BR(SS3)
SS3:
CMPLT(r2,r1,r10)
BNE(r10,swap3,r31)
BR(ket_thuc)
swap1:
ADDC(r0,0,r3)
ADDC(r1,0,r0)
ADDC(r3,0,r1)
BR(SS2)
swap2:
ADDC(r0,0,r3)
ADDC(r2,0,r0)
ADDC(r3,0,r2)
BR(SS3)
swap3:
ADDC(r2,0,r3)
ADDC(r1,0,r2)
ADDC(r3,0,r1)
5
// BR(ket_thuc)
ket_thuc:
HALT()
Program :
.include "beta.uasm"
ADDC(r31,12,r0)
ST(r0,a+8,r31) // r0 --> M(4)
LD(r31,a+12,r5) // a[3] --> R5
HALT()
----------------------------------------------------------------------
// Bài 7: Sắp xếp a[0], a[1] và a[2] theo thứ tự tăng dần.
.include "beta.uasm"
LD(r31,a,r0) // r0=a0
LD(r31,a+4,r1) // r1=a1
LD(r31,a+8,r2) // r2=a2
// Sắp xếp 3 thanh ghi r0, r1, r2 theo thứ tự tăng dần
SS1:
CMPLT(r1,r0,r10) // nếu r1<r0 thì r10=1.
BNE(r10,swap1,r31) // nếu r10 khác 0 thì nhảy đến swap1
SS2:
CMPLT(r2,r0,r10)
BNE(r10,swap2,r31)
SS3:
CMPLT(r2,r1,r10)
BNE(r10,swap3,r31)
BR(luu_kq)
swap1:
ADDC(r0,0,r3)
ADDC(r1,0,r0)
ADDC(r3,0,r1)
BR(SS2)
swap2:
ADDC(r0,0,r3)
ADDC(r2,0,r0)
6
ADDC(r3,0,r2)
BR(SS3)
swap3:
ADDC(r2,0,r3)
ADDC(r1,0,r2)
ADDC(r3,0,r1)
luu_kq:
ST(r0,a,r31) // r0 --> a0
ST(r1,a+4,r31) // r1 --> a1
ST(r2,a+8,r31) // r2 --> a2
HALT()
----------------------------------------------------------------------
.include "beta.uasm"
LD(r31,a,r0)
LD(r31,a+12,r1)
ST(r1,a,r31)
ST(r0,a+12,r31)
HALT()
----------------------------------------------------------------------
// Bài 9: Nếu a[3] < a[0] thì đổi giá trị a[0] và a[3].
.include "beta.uasm"
LD(r31,a,r0)
LD(r31,a+12,r1)
CMPLT(r1,r0,r10)
BNE(r10,SWAP,r31)
BR(ket_thuc)
SWAP:
ST(r1,a,r31)
ST(r0,a+12,r31)
ket_thuc:
7
HALT()
----------------------------------------------------------------------
// Bài 10: Tìm giá trị MAX của a[1], a[2] và a[3], kết quả lưu vào a[0].
.include "beta.uasm"
LD(r31,a+4,r1) // a1 --> r1
LD(r31,a+8,r2) // a2 --> r2
LD(r31,a+12,r3) // a3 --> r3
true1:
ADDC(r2,0,r0) // r0=r2
BR(SS2)
true2:
ADDC(r3,0,r0) // r0=r3
BR(luu_kq)
luu_kq:
ST(r0,a,r31) // r0 --> a0
HALT()
----------------------------------------------------------------------
// 16. Tìm ước số chung lớn nhất của a[0] và a[1] lưu vào a[2].
.include "beta.uasm"
8
LD(r31,a+4,r1) // a1 --> r1
LD(r31,a,r0) // a0 --> r0
false:
SUB(r0,r1,r0)
BR(SS1)
true:
SUB(r1,r0,r1)
BR(SS1)
luu_kq:
ADDC(r0,0,r2) // r2=r0
ST(r2,a+8,r31) // r2 --> a[2]
HALT()
----------------------------------------------------------------------
.include "beta.uasm"
LD(r31,a,r0) // r0=a[0]
ADDC(r31,0,r1) // r1=0
ADDC(r31,1,r2) // r2=1
SS:
CMPLE(r2,r0,r10) // neu r2<=r0 thi r10=1
BNE(r10,true,r31) // neu r10 khac 0 thi nhay den true
BR(luu_kq)
true:
ADD(r1,r2,r1) // r1=r1+r2
ADDC(r2,1,r2)
BR(SS)
luu_kq:
ST(r1,a+4,r31) // r1 --> a[1]
HALT()
//-------------------
a: LONG(0x123) // a[0] - địa chỉ a
9
----------------------------------------------------------------------
// 20. Xác định a[0] có phải là số chính phương không không? Nếu có ghi 1 vào a[1],
ngược lại ghi 0.
.include "beta.uasm"
LD(r31,a,r0) // r0=a[0]
ADDC(r31,0,r1) // r1=0
ST(r1,a+4,r31) // a[1]=0
ADDC(r31,1,r1) // r1=1
loop:
ket_thuc:
HALT()
//-------------------
a: LONG(25) // a[0] - địa chỉ a
LONG(0) // a[1] - địa chỉ a+4
----------------------------------------------------------------------
HOMEWORK:
Làm các bài tập còn lại.
----------------------------------------------------------------------
----------------------------------------------------------------------