You are on page 1of 7

ĐẠI HỌC QUỐC GIA TP.

HỒ CHÍ MINH
TRƯỜNG ĐAI HỌC CÔNG NGHỆ THÔNG TIN

TỐ CHỨC VÀ CẤU TRÚC MÁY TÍNH II


LỚP: IT012.N21

BÀI BÁO CÁO THỰC HÀNH SỐ 3

Giảng viên hướng dẫn: Nguyễn Thành Nhân


Sinh viên: Đặng Thanh Ngân
MSSV: 22520929

1
MỤC LỤC:

2.Thực hành.......................................................................................................................... 2
2.1 Chuyển đoạn code trong bảng sang MIPS và sử dụng MARS để kiểm tra lại kết quả:. 3
3. Bài tập............................................................................................................................... 3
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:.....................3
 Ký tự liền trước và liền sau của ký tự nhập vào........................................................3
 Ký tự nhập vào chỉ được phép là ba loại: số, chữ thường và chữ hoa.Nếu không
xuất “invalid type:..........................................................................................................4
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:. .5

2
2.Thực hành
2.1 Chuyển đoạn code trong bảng sang MIPS và sử dụng MARS để kiểm tra lại kết quả:

Đoạn code MIPS Ý nghĩa


if (i == j) bne $s0, $s1, IF Nếu s0 khác s1 thì thực hiện lệnh if
f = g + h; ELSE: là s2=t0-t1, sau đó tiếp tục tới EXIT
else f = g – h;
add $s2, $t0, $t1
j EXIT Nếu s0 == s1 thì thực hiện tiếp tục
IF: sau lệnh bne là s2= t0+t1, sau đó
sub $s2,$t0,$t1 nhảy tới EXIT
EXIT:
(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)

Đoạn code MIPS Ý nghĩa


int Sum = 0 .text
for (int i = 1; i <=N; + addi $s2, $0, 0 Gán s2 (sum)=0
+i) Gán s0(i)=1
{ Sum = Sum + i; }
addi $s0, $0, 1
li $v0, 5 Gán v0=5
syscall Nhập v0
add $s1, $v0, $0 Cho s1(n)=v0

LOOP:
S3 =1 khi s0<s1 (i<n)
slt $s3, $s0, $s1
Nếu s3 ==0 (s0>=s1) thì EXIT
beq $s3, $0, EXIT
Nếu s3==1 (s0<s1) thì thực thiện
add $s2, $s2, $s0
S2=s2+s0 và s0=s0+1;
addi $s0, $s0, 1
Nhảy lại lệnh LOOP thực hiện lại vòng
j LOOP
lặp
EXIT:
add $s2, $s2, $s1 Gán s2=s2+s1
(Với giá trị của i, N, Sum lần lượt chứa trong các thanh ghi $s0, $s1, $s2)

3
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
Áp dụng mã ASCII
MIPS Ý nghĩa
.text
li $v0, 12
syscall Nhập kí tự
la $s0, ($v0)
Gán a0= s0-1 (ký tự đứng trước)
add $a0, $s0, -1
li $v0, 11 Xuất kí tự ở a0
syscall Gán a0=s0+1 (ký tự đứng sau)
add $a0, $s0, 1
li $v0, 11 Xuất kí tự ở a0
syscall

 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:
a là kí tự, áp dụng bảng mã ASCII, ta có
48<=a<=57 : a là số
65<=a<=90: a là chữ hoa
97<=a<=122: a la chữ thường
MIPS Ý nghĩa
.data
string1: .asciiz "la so"
string2: .asciiz "la chu thuong"
string3: .asciiz "la chu hoa"
string4: .asciiz "invalid type"

.text
li $v0, 12
syscall Nhập kí tự và gán vào s0
la $s0, ($v0) Gán t1 =1 để so sánh
li $t1, 1
Gán s1=1 nếu s0<48
Nếu s1==t1 thì thực hiện lệnh EXIT
slti $s1, $s0, 48 # s0<48
Gán s1 =1 nếu s0<58
beq $s1, $t1, EXIT
4
slti $s1, $s0, 58 Nếu s1==0 thì thực hiện lệnh EXIT 1
beq $s1, $0, EXIT1 Nếu (s0>=48 && s0<=57) thì xuất ra chuỗi
la $a0, string1 string1
li $v0, 4
syscall Nhảy đến END
j END
EXIT1: Gán s1=1 khi s0<65
slti $s1, $s0, 65 # s0 <64 Nếu s1==1 thì thực hiện EXIT, không thì tiếp tục
beq $s1, $t1, EXIT Gán s1= 1 khi s0<91
slti $s1, $s0, 91 Nếu s1==0 thì thực hiện EXIT 2
beq $s1, $0, EXIT2 Nếu s1==1 thì xuất chuối 3 và nhảy tới lệnh END
la $a0, string3
li $v0, 4
syscall
j END Gán s1=1 khi s0<96
EXIT2: Nếu s1==1 thì thực hiện EXIT, không thì tiếp tục
slti $s1, $s0, 97 # s0 <96 Gán s1= 1 khi s0<123
beq $s1, $t1, EXIT Nếu s1==0 thì thực hiện EXIT 2
slti $s1, $s0, 123 Nếu s1==1 thì xuất chuối 4 và nhảy tới lệnh END
beq $s1, $0, EXIT
la $a0, string2
li $v0, 4
syscall
Vì a0 không phải là chữ và số nên xuất ra chuỗi 4
j END
và thoát
EXIT:
la $a0, string4
li $v0, 4
syscall
END:

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
MIPS Ý nghĩa
.text
li $v0, 5
syscall
Nhập số thứ nhất gán vào s0
la $s0, ($v0)
li $v0, 5
syscall Nhập số thứ hai gán vào s1
la $s1, ($v0)

5
## Nếu s0<s1 thì s2=1, Nếu s0==s1 thì s2=0
slt $s2, $s0, $s1 Nếu s1 != s0 thì thực hiện lệnh ELSE
bne $s1, $s0, ELSE Nếu s1==s0 thì nhảy tới END để kết thúc
j END

ELSE: Nếu s2==0 (s0>s1) thì thực hiện lệnh ELSE1 để xuất s0
beq $s2, $0, ELSE1 Nếu s2==1 (s0<s1) thì xuất s1
li $v0, 1
la $a0, ($s1)
syscall
j END
ELSE1:
li $v0, 1
la $a0, ($s0)
syscall
END:

Tổng, hiệu, tích và thương của hai số


MIPS Ý nghĩa
.data
.text
li $v0, 5
syscall Nhập số thứ nhất lưu vào s0
la $s0, ($v0)
li $v0, 5
syscall Nhập số thứ hai lưu vào s1
la $s1, ($v0)
## Gán a0=s0+s1
add $a0, $s0,$s1
li $v0, 1 Xuất a0
syscall
Gán a0=s0-s1
sub $a0, $s0,$s1
Xuất a0
li $v0, 1
Thực hiện s0*s1, sau đó thanh ghi Lo lưu nửa thấp của
syscall
kết quả, và Li lưu nữa cao của kết quả
##
Gán t1=Lo
mult $s0,$s1
mflo $t1
la $a0, ($t1) Xuất t1
li $v0, 1 (Nháp xuất Ho)
syscall
# mfhi $t1
6
# la $a0, ($t1)
# li $v0, 1 Thực hiện s0 chia cho s1, thanh ghi Lo sẽ lưu kết quả
# syscall s0/s1 (lấy phần nguyên), thanh ghi Hi sẽ lưu kết quả
## s0%s1 (lấy phần dư)
div $s0, $s1 Gán t1= Lo

mflo $t1 Xuất t1 (chia lấy nguyên)


la $a0, ($t1)
li $v0, 1 Gán t1=Hi
syscall
mfhi $t1 Xuất t1 (chia lấy dư)
la $a0, ($t1)
li $v0, 1
syscall

You might also like