






Preview text:
lOMoAR cPSD| 59285474
CE119-Lab02/IT012- Lab04 1. Lý thuyết
Giảng viên hướng dẫn sinh viên về chương trình hợp ngữ MIPS dựa theo tài liệu: Tổng
quát về hợp ngữ và kiến trúc MIPS 2. Thực hành
Chuyển đoạn code trong bảng theo sau sang MIPS và sử dụng MARS để kiểm tra lại kết quả: if (i == j) f = g + h; else f = g – h;
(Với giá trị của i, j, f, g, h lần lượt chứa trong các
thanh ghi $s0, $s1, $s2, $t0, $t1)
.data i: .asciiz "Nhap i: " j: .asciiz "Nhap j: " syscall # Nhập j từ bàn phím f: .asciiz "Ket qua: " move $s1, $v0
# Lưu giá trị j vào .text $s1 main: addi $t0, $t0, 5
# Khởi tạo giá trị g li $v0, 4 addi $t1, $t1, 6
# Khởi tạo giá trị h la $a0, i bne $s0, $s1, Else
# i != j thì nhảy tới syscall # In “Nhap i: “ Else li $v0, 5 add $s2, $t0, # f = g + h (5 + 6) $t1 j exit Else: syscall # Nhập i từ bàn
phím move $s0, $v0 # Lưu giá trị i vào $s0 sub $s2, $t0, $t1
# f = g – h (5 – 6) li $v0, 4 exit: li $v0, 4 la $a0, j la $a0,
syscall # In “Nhap j: “ li $v0, 5 f syscall li $v0, # In “Ket qua” 1 move $a0, $s2 syscall # Xuất giá trị f lOMoAR cPSD| 59285474
int Sum = 0 for (int i = 1; i <=N; ++i) { Sum = Sum + i; }
(Với giá trị của i, N, Sum lần lượt chứa trong các thanh ghi $s0, $s1, $s2)
.data s: .asciiz "Nhap N: " add $s2, $s2, $s0 # Sum = Sum + i sum: .asciiz "Tong = addi $s0, $s0, 1 # i = i + 1 " j Loop
# Tiếp tục vòng lặp .text main: exit: li $s2, 0 # Gán Sum = 0 li $v0, 4 li $s0, 1 # Gán i = 1 la $a0, sum li $v0, 4 syscall # In “Tong = ” syscall li # In chuỗi s1 la $a0, # In “Nhap N: ” $v0, 12 s syscall li $v0, 5 syscall move # Nhập 1 ký tự $s0, $v0 syscall # Nhập N li $t0, 97
# Đặt flag cho chữ move $s1, $v0 li $t1, 122 in thường 3. Bài tập
a. Nhập vào một ký tự, xuất ra cửa sổ I/O của MARS theo từng 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
Ký tự nhập vào chỉ được phép là ba loại: số, chữ thường và chữ hoa. Nếu ký tự nhập vào rơi vào
một trong ba loại, xuất ra cửa sổ đó là loại nào; nếu ký tự nhập không rơi vào một trong ba loại trên,
xuất ra thông báo “invalid type” Loop:
bgt $s0, $s1, exit # Nếu
i > N thì nhảy exit lOMoAR cPSD| 59285474 li $v0, 1 move $a0, $v0, 4 la $s2 syscall # In kết $a0, s1 quả Sum ra màn
blt $s0, $t0, checkUpper
hình .data s1: .asciiz
bgt $s0, $t1, invalid j "Nhap ky tu (chi 1 ky operations
tu): " s2: .asciiz "\nKy
# Nếu ký tự có mã ASCII vượt quá 122 thì
tu truoc: " s3: .asciiz
là ký tự đặc biệt còn bé hơn 97 thì ta kiểm "\nKy tu sau: " tra chữ in hoa s4: .asciiz "\nInvalid checkUpper: type"
li $t0, 65 li $t1, 90 blt .text
$s0, $t0, checkDigit bgt . $s0, $t1, invalid g
# Nếu ký tự > 90 đồng thời <97 ở đkiện trước đó l
thì là ký tự đặc biệt. Còn bé hơn 65 thì ta kiểm tra o
chứ số checkDigit: b li $t0, 48 li $t1, 57 l blt $s0, $t0, invalid m a bgt $s0, $t1, invalid i
# Nếu ký tự < 48 & >57 thì là ký tự đặc biệt n
operations: li $v0, 4 la $a0, s2 m a i n : l i j operations exit: lOMoAR cPSD| 59285474 syscall # In chuỗi s2 subi $a0, $s0, 1
# Tính ký tự đứng trước li $v0, 11 syscall li
# In ký tự đứng trước $v0, 4 la $a0, s3 syscall # In chuỗi s3 addi $a0, $s0, 1
# Tính ký tự đứng sau li $v0, 11 syscall
# In ký tự đứng sau j exit
invalid: li $v0, 4 la $a0, s4 syscall # In chuỗi s4 b.
Nhập từ bàn phím 2 số nguyên, in ra cửa sổ I/O của MARS theo từng yêu cầu sau: Số lớn hơn Tổng, hiệu, tích và
thương của hai số lOMoAR cPSD| 59285474 .data lOMoAR cPSD| 59285474 A: .asciiz la $a0, B "Nhap so
syscall # In chuỗi B ra màn hình li $v0, nguyen A: " 5 B: .asciiz
syscall #Nhập số nguyên từ bàn phím move "Nhap so
$s1, $v0 beq $s0, $s1, equal # So sánh A và nguyen B: "
B li $v0, 4 la $a0, solonhon syscall slt $t0, tong: .asciiz
$s0, $s1 bne $t0, 0, greater move $a0, $s0 "\nTong
li $v0, 1 syscall j operations (A+B) = " greater: hieu: .asciiz li $v0, 1 "\nHieu (A- move $a0, B) = " $s1 syscall j tich: .asciiz operations "\nTich equal: (A*B) = " li $v0, 4 la $a0, over: .asciiz bangnhau syscall "\nKet qua tich qua lon operations: (vuot qua 32 add $t0, $s0, $s1 # Tính tổng A+B bit trong so li $v0, 4 la thap)" $a0, tong thuong: .ascii syscall z "\nThuong li $v0, 1 move (A/B) = " $a0, $t0 du: .asciiz syscall "\tSo du = " sub $t0, $s0, $s1 # Tính hiệu A-B solonhon: .as li $v0, 4 la ciiz "So lon $a0, hieu hon: " syscall bangnhau: .asciiz li $v0, 1 move "Hai so bang nhau" $a0, $t0 .text syscall m mult $s0, $s1 # Tính tích A*B a mfhi $t0 beq $t0, 0, i notover li $v0, 4 la n $a0, over syscall : j div li $v0, 4 notover:
# Nếu tích không vượt quá la $a0, A
32bit trọng số thấp li syscall # In chuỗi
$v0, 4 la $a0, tich syscall mflo $t0 li A ra màn hình li
$v0, 1 move $a0, $t0 syscall $v0, 5 div: syscall # Nhập div $s0, $s1 # Tính thương A/B số nguyên từ li $v0, 4 la $a0, bàn phím move
thuong syscall mflo $t0 $s0, $v0 li $v0,
li $v0, 1 move $a0, $t0 4
syscall li $v0, 4 la $a0, lOMoAR cPSD| 59285474 d
scall mfhi $t0 li $v0, 1 u move $a0, $t0 syscall sy exit: