Thực hành lab Cấu trúc và kiến trúc máy tính trương uit, bài tap ve nha. Thực hành lab Cấu trúc và kiến trúc máy tính trương uit, bài tap ve nhaThực hành lab Cấu trúc và kiến trúc máy tính trương uit, bài tap ve nhaThực hành lab Cấu trúc và kiến trúc máy tính trương uit, bài tap ve nhaThực hành lab Cấu trúc và kiến trúc máy tính trương uit, bài tap ve nha
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TINKHOA KHOA HỌC VÀ KỸ THUẬT THÔNG TIN
BÁO CÁO THỰC HÀNH
<Bài lab số 3, 4, 5>
Trang 3NHẬN XÉT CỦA GIẢNG VIÊN
Trang 4MỤC LỤC
Câu 1: Nhập vào một ký tự, xuất ra cửa sổ I/O của MARS theo yêu cầu sau: Ký tự liền trước và liền sau của ký tự nhập vào 5Câu 2 Nhập một mảng các số nguyên n phần tử (nhập vào số phần tử và giá trị của từng phần tử), xuất ra cửa sổ I/O của MARS theo từng yêu cầu sau: 6Câu 3: Chuyển số có 3 chữ số 11
Trang 5Câu 1: Nhập vào một ký tự, xuất ra cửa sổ I/O của MARS theo yêu cầu sau: Ký tự liền trước và liền sau của ký tự nhập vào
Ví dụ: Nhap ky tu (chỉ một ký tự): b Ky tu truoc: a Ky tu sau: cĐoạn mã:
.datanhap: asciiz "Nhap ky tu (chi mot ky tu): "truoc: asciiz "\nKy tu truoc: "
sau: asciiz "\nKy tu sau: ".text
li $v0, 4 la $a0, nhap syscall # Nhập ký tự từ người dùng li $v0, 12
syscall move $t0, $v0 # Lưu ký tự nhập vào $t0 # Tính toán ký tự liền trước và liền sau addi $t1, $t0, -1 # Ký tự liền trước addi $t2, $t0, 1 # Ký tự liền sau # In ký tự liền trước
li $v0, 4 la $a0, truoc syscall li $v0, 11 move $a0, $t1 syscall
Trang 6# In ký tự liền sau li $v0, 4
la $a0, sau syscall li $v0, 11 move $a0, $t2 syscall
Câu 2 Nhập một mảng các số nguyên n phần tử (nhập vào số phần tử và giá trị của từng phần tử), xuất ra cửa sổ I/O của MARS theo từng yêu cầu sau:
✓ Xuất ra giá trị lớn nhất và nhỏ nhất của mảng ✓ Tổng tất cả các phần tử của mảng
✓ Người sử dụng nhập vào chỉ số của một phần tử nào đó và giá trị của phần tử đó được in ra cửa sổĐoạn code:
.datathongbao: asciiz "Nhap so phan tu n: "nhap: asciiz "Nhap phan tu: "
abc: asciiz "A["abc1: asciiz "]= "max_msg: asciiz "Gia tri lon nhat: "min_msg: asciiz "Gia tri nho nhat: "tong_msg: asciiz "Tong cac phan tu: "index_msg: asciiz "Nhap chi so phan tu can lay gia tri: "ketqua: asciiz "Gia tri tai chi so: "
mang: word 10
.text
Trang 7# Nhập số phần tử n li $v0, 4
la $a0, thongbao syscall
li $v0, 5 syscall move $t0, $v0 # Lưu số phần tử vào $t0
# Nhập các phần tử vào mảng li $t7, 0 # Biến đếm
la $s0, mang
nhap_mang: li $v0, 4 la $a0, nhap syscall
li $v0, 4 la $a0, abc syscall
move $a0, $t7 li $v0, 1 syscall # In chỉ số
li $v0, 4
Trang 8la $a0, abc1 syscall
li $v0, 5 syscall sll $t1, $t7, 2 add $t2, $s0, $t1 # Tính địa chỉ của phần tử hiện tại sw $v0, 0($t2) # Lưu giá trị vào mảng
addi $t7, $t7, 1 blt $t7, $t0, nhap_mang # Lặp lại nếu chưa nhập đủ
exit: # Tính tổng, tìm max và min la $s2, mang
lw $t1, 0($s2) move $s3, $t1 # max move $s4, $t1 # min li $s5, 0 # tổng li $s6, 0 # biến đếm
tinh_tong_max_min: lw $t1, 0($s2) add $s5, $s5, $t1 # tổng bgt $t1, $s3, capnhat_max blt $t1, $s4, capnhat_min j tieptuc
Trang 9capnhat_max: move $s3, $t1 j tieptuc
capnhat_min: move $s4, $t1
tieptuc: addi $s2, $s2, 4 addi $s6, $s6, 1 blt $s6, $t0, tinh_tong_max_min
# In giá trị lớn nhất li $v0, 4
la $a0, max_msg syscall
li $v0, 1 move $a0, $s3 syscall
# In giá trị nhỏ nhất li $v0, 4
la $a0, min_msg syscall
Trang 10li $v0, 1 move $a0, $s4 syscall
# In tổng các phần tử li $v0, 4
la $a0, tong_msg syscall
li $v0, 1 move $a0, $s5 syscall
# Nhập chỉ số và in giá trị phần tử tại chỉ số đó li $v0, 4
la $a0, index_msg syscall
li $v0, 5 syscall move $t6, $v0 # Lưu chỉ số vào $t6
sll $t6, $t6, 2 # t6 = t6 * 4 (mỗi phần tử 4 bytes) la $a0, mang
add $a0, $a0, $t6 lw $t5, 0($a0) li $v0, 4
Trang 11la $a0, ketqua syscall
move $a0, $t5 li $v0, 1 syscall
Câu 3: Chuyển số có 3 chữ số
.data thongbao: asciiz "Nhap so 3 chu so: " mang: space 10
so0: asciiz "khong " so1: asciiz "mot " so2: asciiz "hai " so3: asciiz "ba " so4: asciiz "bon " so5: asciiz "nam " so6: asciiz "sau " so7: asciiz "bay " so8: asciiz "tam " so9: asciiz "chin ".text
# Nhập số có 3 chữ số và lưu vào $t0 li $v0, 4
la $a0, thongbao syscall
li $v0, 5 syscall
Trang 12move $t0, $v0
# Chia lần lượt để lấy từng chữ số và lưu vào mảng li $s7, 10 # Số cơ số (decimal)
li $t7, 0 # Biến đếm lặp la $s1, mang # Địa chỉ bắt đầu của mảng
loop: div $t0, $s7 mfhi $t1 # Số dư mflo $t0 # Thương add $s2, $s1, $t7 sb $t1, 0($s2) # Lưu chữ số vào mảng addi $t7, $t7, 1
beq $t7, 3, exit_loop j loop
exit_loop: # Lấy các chữ số từ mảng và in ra chữ cái tương ứng với các chữ số la $s1, mang
addi $s1, $s1, 2 li $t7, 0
print_loop: lb $t1, 0($s1) li $v0, 4 beq $t1, 9, print_so9
Trang 13beq $t1, 8, print_so8 beq $t1, 7, print_so7 beq $t1, 6, print_so6 beq $t1, 5, print_so5 beq $t1, 4, print_so4 beq $t1, 3, print_so3 beq $t1, 2, print_so2 beq $t1, 1, print_so1 beq $t1, 0, print_so0 j next_digit
print_so0: la $a0, so0 syscall j next_digit
print_so1: la $a0, so1 syscall j next_digit
print_so2: la $a0, so2 syscall j next_digit
print_so3:
Trang 14la $a0, so3 syscall j next_digit
print_so4: la $a0, so4 syscall j next_digit
print_so5: la $a0, so5 syscall j next_digit
print_so6: la $a0, so6 syscall j next_digit
print_so7: la $a0, so7 syscall j next_digit
print_so8: la $a0, so8 syscall
Trang 15j next_digit
print_so9: la $a0, so9 syscall j next_digit
next_digit: subi $s1, $s1, 1 addi $t7, $t7, 1 bne $t7, 3, print_loop
end: # Kết thúc chương trình li $v0, 10
syscall