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

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: