/61
lOMoARcPSD|27790909
Downloaded by M?
M? (nguyenmo081102@gmail.com)
ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA KỸ THUẬT MÁY TÍNH
BÁO CÁO MÔN HỌC
THỰC HÀNH KIẾN TRÚC MÁY TÍNH
CE119.L12.MTCL.1
GIẢNG VIÊN HƯỚNG DẪN: TRẦN ĐẠI DƯƠNG
SINH VIÊN THỰC HIỆN: NGUYỄN TUẤN ANH – 19520794
TP. HỒ CHÍ MINH, 12/2020
lOMoARcPSD|27790909
I
MỤC LỤC
Chương 1. LÀM QUEN V I L P TRÌNH HP NG..........................................................1
1.1/ Lý thuyết....................................................................................................................................1
1.1.1/ Bộ nhớ................................................................................................................................1
1.1.2/ Biểu diễn thông tin........................................................................................................1
1.1.3/ Thanh ghi..........................................................................................................................1
1.1.4/ Cấu trúc của 1 chương trình.......................................................................................2
1.1.5/ Khai báo dữ liệu,biến....................................................................................................2
1.2/ Thực hành..................................................................................................................................3
1.2.1/ Sinh viên tìm hiểu tài liệu “Một số lệnh assembly MIPS cơ bản..............3
1.2.2/ Mô phỏng các chương trình bên dưới và cho biết ý nghĩa:............................5
1.3/ Bài tập.........................................................................................................................................7
1.3.1/ Nhập vào một chuỗi, xuất ra cửa sổ I/O của MARS theo từng yêu cầu
sau:....................................................................................................................................................
7
Chương 2. CẤẤU TRÚC ĐIỀỀU KHI N
.........................................................................................10
1.1/ Lý thuyết..................................................................................................................................10
1.1.1/ Cấu trúc if else..........................................................................................................10
1.1.2/ Cấu trúc switch case...............................................................................................11
1.1.3/ Cấu trúc vòng lặp for..................................................................................................11
1.2/ Thực hành................................................................................................................................11
1.2.1/ 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ả:.................................................................................................................11
lOMoARcPSD|27790909
II
1.2.2/..............................................................................................................................................14
1.3/ Bài tập.......................................................................................................................................15
1.3a/...............................................................................................................................................15
1.3b/...............................................................................................................................................20
Chương 3. CON TR VÀ TRUY XUẤẤT B
NH ..................................................................24
1.1/ Lý thuyết..................................................................................................................................24
1.1.1/ Nhắc lại về bộ nhớ......................................................................................................24
1.1.2/ Nhắc lại về khai báo biến,kiểu dữ liệu................................................................24
1.1.3/ Mảng vào con trỏ.........................................................................................................24
1.2/ Thực hành................................................................................................................................25
1.3/ Bài tập.......................................................................................................................................32
1.3a/...............................................................................................................................................32
1.3b/...............................................................................................................................................38
Chương 4. TH T C VÀ HÀM CON.........................................................................................41
1.1/ Lý thuyết..................................................................................................................................41
1.1.1/ Thứ tự của một thủ tục và hàm con:.....................................................................41
1.1.2/ Cách thực thi trong thủ tục và hàm con:.............................................................41
1.1.3/ Quy ước thanh ghi trong MIPS:.............................................................................41
1.2/ Thực hành với thủ tục.........................................................................................................41
1.3/ Thực hành với đệ quy.........................................................................................................57
1.4/ Bài tập.......................................................................................................................................59
1.4a/...............................................................................................................................................59
lOMoARcPSD|27790909
III
1.4b/...............................................................................................................................................60
DANH MỤC HÌNH ẢNH
H
nh 1.1: đồ giải thuật 1.3.1a
Lab1.........................................................................................7 H
nh 1.2: đồ giải thuật
1.3.1d Lab1......................................................................................10
H
nh 2.1: đồ giải thuật 1.2.1
Lab2.........................................................................................13
H
nh 2.2: đồ giải thuật 1.2.2
Lab2.........................................................................................15
H
nh 2.3: đồ giải thuật 1.3a
Lab2..........................................................................................19
H
nh 2.4: đồ giải thuật 1.3b
Lab2..........................................................................................23
H
nh 3.1: đồ giải thuật 1.2
Lab3............................................................................................31
H
nh 3.2: đồ giải thuật 1.3a
Lab3..........................................................................................37
H
nh 3.3: đồ giải thuật 1.3b
Lab3..........................................................................................41
H
nh 4.1: S đồồ gi i thu t Yêu cầồu
1ơ ........................................................................................45
H
nh 4.2: S đồồ gi i thu t Yêu cầồu
2ơ ........................................................................................51
H
nh 4.3: S đồồ gi i thu t Yêu cầồu
3ơ ........................................................................................57
lOMoARcPSD|27790909
IV
H
nh 4.4: S đồồ gi i thu t 1.3
Lab4ơ ..........................................................................................60
H
nh 4.5: Stack trong trườ ng h p
5!........................................................................................61 H
nh 4.6: Stack trong trư ng
h p 10!......................................................................................62 DANH MỤC BẢNG
B ng 1.1 : L nh Assembly c b n ơ
.................................................................................................3
B ng 1.2 : Chương trình mẫu............................................................................................................5
B ng 1.3 : Biểu diễn thông tin trong bộ nhớ...............................................................................8
B ng 2.1 : Chuy n đo n code
......................................................................................................12 B ng 2.2 : Chuy n đo n code
2...................................................................................................14
B ng 2.3: Bài t p 1.3.a ...................................................................................................................16
B ng 2.4: Bài t p 1.3.b ...................................................................................................................20
B ng 3.1 : Bài t p th c hành
........................................................................................................25 B ng 3.2 : Bài t p 1.3.a Lab
3........................................................................................................32 B ng 3.3 : Bài t p 1.3.b Lab
3........................................................................................................38
B ng 4.1 : Code trong Yêu cu
1..................................................................................................44
B ng 4.2 : Code trong Yêu cầồu 2.................................................................................................47
B ng 4.3 : Code trong Yêu cu
3..................................................................................................52 B ng 4.4 : Code Th c hành v i
đ quy .....................................................................................58
lOMoARcPSD|27790909
1
Chương 1. LÀM QUEN VỚI LẬP TRÌNH HỢP NGỮ
1.1/ Lý thuyết
1.1.1/ Bộ nhớ.
- Dữ liệu được định nghĩa 1 byte(8 bits),1 half(2 bytes),1 word(4 bytes)
- 1 kí tự là 1 byte để lưu trữ (acsii)
- 1 số nguyên là 1 word để lưu trữ- 1 lệnh là 1 word (32 bits) để lưu trữ
1. 1.2/ Biểu diễn thông tin.
- Ký số:
+ Hệ thập phân: 9,10,
+ Hệ thập lục phân: thêm tiền tố 0x. Vd: 0x20.
- Ký tự: đặt trong ngoặc nháy đơn. Vd: ‘a’.
- Chuỗi: đặt trong cặp nháy kép. Vd: “UIT” (kết thúc chuỗi là kí tự null).
1. 1.3/ Thanh ghi.
- Có 32 thanh ghi đa dụng (thanh ghi 32 bit).
- Biểu diễn: tiền tố $ theo sau là chỉ số hoặc tên của thanh ghi ($0 hoặc $t1).
- Thanh ghi Hi và Lo được dành riêng cho phép nhân và phép chia
+ mfhi, mflo (move from hi/lo).
- Quy ước:
+ $at dành cho assembler, $k0 và $k1 dành cho hệ điều hành.
+ $gp, $sp, $fp, $ra dành cho các mục đích riêng biệt, không nên sử dụng để lưu trữ
tạm trong quá trình tính toán và lập trình.
1. 1.4/ Cấu trúc của 1 chương trình.
Muốn chú thích trong MIPS dùng #
lOMoARcPSD|27790909
2
.data
#khai báo biến.
#khai báo dữ liệu
.text
#viết chương trình sau .text main:
#nhãn để cho người dùng biết nơi bắt đầu chương trình.
#viết chương trình sau đây.
1.1.5/ Khai báo dữ liệu,biến.
<tên biến>: .<kiểu dữ liệu> <danh sách các giá trị>
VD:
string1: .asciiz “UIT” #tạo 1 chuỗi tên string1 với khởi tạo “UIT”.
var1: .word 5 #khai báo 1 số nguyên tên var1 chiếm 1 word lưu trữ, có giá trị khởi
tạo là 5.
array1: .space 10 #tạo 1 mảng array1 có 10 bytes liên tục nhau, chưa khởi tạo giá
trị.
array2: .byte ‘a’, ‘b’ #tạo 1 mảng array2 có 2 phần tử, mỗi phần tử chiếm 1 byte,
khởi tạo giá trị là ‘a’, ‘b’.
1.2/ Bài tập thực hành.
1.2.1/ Sinh viên tìm hiểu tài liệu “Một số lệnh assembly MIPS cơ bản
Mô phỏng việc thực thi các lệnh và cho biết chức năng của các lệnh cơ bản sau: add,
addi, addu, addiu, sub, subu, and, andi, or, nor, lw, sw, slt, slti, sltu, sltiu, syscall.
B ng 1.1: Nh ng l nh Assembly c b n ơ
ST Lệnh Ý Nghĩa VD
lOMoARcPSD|27790909
3
T
1 Add Cộng 2 giá trị của 2 thanh ghi, lưu vào thanh ghi Add $s0, $s1,
$s2 thứ nhất
2 Addi Add immediate Cộng giá trị trong thanh ghi Addi $s0, $s1, 5
thứ 2 với một hằng số 16bit có dấu, lưu vào thanh ghi thứ nhất
3 Addu Add Unsigned Cộng giá trị không dấu trong Addu $s0, $s1, $s2
thanh ghi thứ 2, lưu vào thanh ghi thứ nhất
(Không bị tràn bit)
4 Addiu Add Immediate Unsigned Công giá trị không Addiu $s0, $s1, -5
dấu trong thanh ghi thứ 2 với hằng số 16bit có dấu, lưu vào thanh ghi thứ nhất
(Không bị tràn bit)
5 Sub Lấy giá trị của thanh ghi thứ 2 trừ cho giá trị Sub $s0, $s1, $s2
thanh ghi thứ 3 sau đó lưu giá trị vào thanh ghi thứ nhất
6 Subu Sub unsigned Gía trị không dấu trong thanh Subu $s0, $s1, $s2
ghi thứ 2 trừ cho giá trị không dấu trong thanh ghi thứ 3 sau đó lưu giá trị
vào thanh ghi thứ nhất
7 And And từng bit trong thanh ghi thứ 2 với thanh ghi And $s0,
$s1, $s2 thứ 3 sau đó lưu lại vào thanh ghi thứ nhất
8 Andi And immediate and từng bit trong thanh ghi Andi $s0, $s1, $s2
thứ 2 với hằng số sau khi đổi ra mã nhịn phân theo thứ tự với nhau sau đó
lưu lại vào thanh ghi thứ nhất
9 Or Or từng bit trong thanh ghi thứ 2 với thanh ghi Or $s0, $s1, $s2 thứ
3 theo thứ tự với nhau sau đó lưu lại vào thanh ghi thứ nhất
10 Nor Or từng bit trong thanh ghi thứ 2 với thanh ghi Nor $s0, $s1, $s2
thứ 3 theo thứ tự với nhau, sau đó not lại rồi lưu
vào thanh ghi thứ nhất
11 Lw Load word Lấy giá trị ở địa chỉ bộ nhớ đã Lw $s0 4($s1) được
chỉ định để lưu vào thanh ghi
12 Sw Store word Lấy giá trị trong thanh ghi lưu vào Sw $s0
4($s1) bộ nhớ với giá trị đã được chỉ định
13 Slt Set less than Nếu giá trị trong thanh ghi thứ 2 Slt $s0, $s1, $s2
hơn giá trị trong thanh ghi thứ 3 thì giá trị trong thanh ghi thứ nhất bằng 1,
ngược lại thì bằng 0
14 Slti Set less than immediate Nếu giá trị trong thanh Slti $s0, $s1,
5 ghi thứ 2 bé hơn hằng số thì giá trị trong thanh ghi thứ nhất bằng 1, ngược
lại nếu lớn hơn thì bằng 0
15 Sltu Set less than unsigned nếu giá trị không dấu Sltu $s0, $s1, $s2
trong thanh ghi thứ 2 bé hơn giá trị không dấu trong thanh ghi thứ 3 thì giá
trị trong thanh ghi
thứ nhất bằng 1, ngược lại nếu lớn hơn thì bằng
0
lOMoARcPSD|27790909
4
16 Sltiu Set less than immediate unsigned nếu giá trị Sltiu $s0, $s1, -5
không dấu trong thanh ghi thứ 2 bé hơn hằng số thì giá trị trong thanh ghi thứ nhất
bằng 1, ngược lại nếu lớn hơn thì bằng 0
17 syscall Thực thi lệnh gọi hệ thống
1.2.2/ Mô phỏng các chương trình bên dưới và cho biết ý nga:
B ng 1.2: Chương trình ví dụ
ST
T
VD
Giải thích
1
.data
var1: .word 23
start:
lw $t0, var1
li $t1, 5
sw $t1, var1
Var1 là biến nguyên 4 byte, giá trị khởi tạo là 23
Lưu giá trị ở 23 trong bộ nhớ vào trong thanh ghi $t0
Cho $t1 = 5
Lưu giá trị trong thanh ghi $t1 vào địa chỉ 23 trong
bộ nhớ
2
.data
array1:.space 12
start:
la $t0, array1
li $t1, 5
sw $t1, ($t0)
Khai báo mảng array1 có 12byte
Gán mảng array1 vào thanh ghi $t0
Cho $t1 = 5
Lưu giá trị của $t1 vào ô nhớ địa chỉ là giá trị của $t0
Cho $t1 = 13
lOMoARcPSD|27790909
5
1.3/ Bài tập.
1.3.1/ Nhập vào một chuỗi, xuất ra cửa sổ I/O của MARS theo từng yêu cầu sau:
a) Khai báo và xuất ra cửa sổ I/O 2 chuỗi có giá trị như sau:
- Chuỗi 1: Chao ban! Ban la sinh vien nam thu may?
- Chuỗi 2: Hihi, minh la sinh vien nam thu 1 ^-^
li $t1, 13
sw $t1, 4($t0)
li $t1, -7
sw $t1, 8($t0)
Lưu giá trị của $t1 vào ô nhớ địa chỉ là 4 cộng giá trị
của $t0
Cho $t1 = -7
Lưu giá trị của $t1 vào ô nhớ địa chỉ là 8 công giá trị
của $t0
3
Li $v0,5
syscall
Nhập một số nguyên
4
.data
String1: .ascii “Print this.\n”
Main: li $v0,4
La $a0, string1
syscall
Khai báo chuồỗi đ
c gắắn sn “Print this”
Xuầắt chuồỗi
Gán string1 vào $a0
lOMoARcPSD|27790909
6
H
nh 1.1: đồ giải thuật 1.3.1a Lab1
b) Biểu diễn của 2 chuỗi trên dưới bộ nhớ là gì?
B ng 1.3: Biểu diễn thông tin trong bộ nhớ
0x6f616843 oahC
0x6e616220 nab(khoảng trống) 0x61422021 aB(Khoảng trống)!
0x616c206e al(Khoảng trống)n 0x6e697320 nis(Khoảng trống)
0x69762068 iv(khoảng trống)h 0x6e206e65 n(khoảng trống)ne 0x74206d61
t(khoang trống)ma
lOMoARcPSD|27790909
7
0x6d207568 m(khoảng trống)uh
0x0a3f7961 (khoảng trống)?ya
0x68694800 hiH (khoảng xuống dòng)
0x6d202c69 m(khoảng trống),i 0x20686e69 (khoảng trống)hni
0x7320616c s(khoảng trống)al
0x20686e69 (khoảng trống)hni
0x6e656976
neiv
0x6d616e20 man(khoảng trống)
0x75687420 uht(khoảng trống)
0x5e203120 ^(khoảng trống)1(khoảng trống)
^-
0x00005e2d
c) Xuất ra lại đúng chuỗi đã nhập.
Ví dụ:
Nhap: Truong Dai hoc Cong nghe Thong tin
Xuất: Truong Dai hoc Cong nghe Thong tin
lOMoARcPSD|27790909
8
Hình 1.1: Sơ đồ giải thuật 1.3.1c Lab1
d) Nhập vào 2 số nguyên sau đó xuất tổng của 2 số nguyên này.
lOMoARcPSD|27790909
9
H
nh 1.2: đồ giải thuật 1.3.1d Lab1
Chương 2. CẤU TRÚC ĐIỀU KHIỂN
1.1/ Lý thuyết.
1.1.1/ Cấu trúc if else.
Đầu tiên thực hiện việc so sánh điều kiện
+ So sánh bằng
+ So sánh không bằng
+ So sánh bé hơn, bé hơn hoặc bằng
+ So sánh lớn hơn, lớn hơn hoặc bằng
lOMoARcPSD|27790909
10
- Nếu điều kiện đúng, thực hiện lệnh và có thể là đoạn lệnh ở bên trong, nếu
sai thì tới điều kiện tiếp theo hoặc kết thúc chương trình.
1.1.2/ Cấu trúc switch – case.
- Kiếm tra điều kiện để đưa vào trường hợp đúng, có thể chuyển thành cấu trúc if, if-
else.
1.1.3/ Cấu trúc vòng lặp for.
- Kiếm tra điều kiện, để quyết định có nhảy hay không, điều kiện không thỏa thì kết
thúc chương trình.
1.2/ Thực hành.
1.2.1/ 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ả:
(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).
B ng 2.4: Chuy n đo n code
lOMoARcPSD|27790909
11
Code mẫu
MIPS
Ý nghĩa
if (i == j)
f = g + h;
else
f = g h;
bne $s0, $s1, else
add $s2,$t0,$t1
j exit
else:
sub $s2,$t0,$t1
exit:
-
So sánh i và j, nếu không bằng thì
nhảy đến else
-
Thực hiện g + h
-
Nhảy tới exit
-
Lệnh else
:
-
Thực hiện g- h
Kết thúc
lOMoARcPSD|27790909
12
H
nh 2.3: Sơ đồ giải thuật 1.2.1 Lab2
1.2.2/
(Với giá trị của i, N, Sum lần lượt chứa trong các thanh ghi $s0, $s1, $s2)
lOMoARcPSD|27790909
13
B ng 2.5: Chuy n đo n code 2
int Sum = 0
for (int i = 1; i
N; ++i){
<=
Sum = Sum + i;
}
addi $s2,$zero,0
addi $s0,$zero,1
loop:
slt $a0,$s0,$s1
beq $s0,$s1, work
beq $a0,$zero,exit
add $s2,$s2,$s0
addi $s0,$s0,1
j loop
work:
add $s2,$s2,$s0
addi $s0,$s0,1
exit:
-
Khởi tạo giá trị Sum
-
Khởi tạo giá trị i
So sánh i < N
-
So sánh i = N thì nhảy đến work
-
-
So sánh kết quả của i<N với 0 bằng
thì nhảy đến exit
-
Sum = Sum + i
-
i = i
+1
-
Nhảy loop
-
Sum = Sum + i
-
i = i
+1
lOMoARcPSD|27790909
14
H
nh 2.4: Sơ đồ giải thuật 1.2.2 Lab2
1.3/ Bài tập.
1.3a/
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:
- Ví dụ: Nhap ky tu (chỉ một ký tự): b
Ky tu truoc: a
Ky tu sau: c
lOMoARcPSD|27790909
15
- Ký tự nhập vào là: hoa, thường, số. Nhập vào loại nào thì xuất ra loại đó. Nếu
không phải 3 loại trên thì xuất “invalid type”.
B ng 2.6: Bài t p 1.3a
.data string1: .asciiz "Nhap ki tu: "
string2: .asciiz "\nKi tu truoc: "
string3: .asciiz "\nKi tu sau: "
string4: .asciiz "\ninvalid type"
string5: .asciiz "\nLoai so"
string6: .asciiz "\nLoai chu"
string7: .asciiz "\nLoai chu hoa"
.text addi $v0,
$zero, 4 lui $1,
0x00001001 ori
$a0, $1, 0 syscall
addi $v0, $zero, 12
syscall addi $t0,
$v0, 0
slti $t1, $t0, 123 # >122
beq $t1, $zero, end
slti $t1, $t0, 97 bne
$t1, $zero, work1 j
chu
work1:
slti $t2, $t0, 91
beq $t2, $zero, end
j work2
work2:
slti $t1, $t0, 65 # 58< <64
bne $t1, $zero, work3 j
chuhoa
Khai báo các chuỗi.
Xuất string1 ra màn hình.
Nạp 1 kí tự từ bàn phím vào và
lưu ở thanh ghi v0.
Chuyển giá trị cho thanh ghi t0.
Nếu giá trị của t0 lớn hơn 122
nhảy tới end.
Nếu giá trị của t0 nhỏ hơn 97
nhảy tới work1. Còn lớn hơn bằng
97 thì nhảy tới hàm chu.
Nếu giá trị của t0 lớn hơn bằng 91
nhảy tới end. Còn nhỏ hơn 91 thì
nhảy tới work2.
Nếu giá trị của t0 nhỏ hơn 65
nhảy tới work3. Còn lớn hơn bằng
65 thì nhảy tới hàm chuhoa.
lOMoARcPSD|27790909
16
work3:
slti $t2, $t0, 58
beq $t2, $zero, end
j work4
work4:
slti $t1, $t0, 48 # <48
bne $t1, $zero, end
j so
so:
addi $v0, $zero, 4
lui $1, 0x00001001
ori $a0, $1, 55
syscall
j main
chu:
addi $v0, $zero, 4
lui $1, 0x00001001
ori $a0, $1, 64
syscall
j main
chuhoa:
addi $v0, $zero, 4
lui $1, 0x00001001
ori $a0, $1, 74
syscall
j main
main:
addi $v0, $zero, 4 #xuat str2
lui $1, 0x00001001
ori $a0, $1, 13
syscall
addi $a0, $t0, -1
addi $v0, $zero, 11
syscall
addi $v0, $zero, 4 #xuat str3
Nếu giá trị của t0 lớn hơn bằng 58
nhảy tới end. Còn nhỏ hơn 58 thì
nhảy tới work4
Nếu giá trị của t0 nhỏ hơn 48
nhảy tới end. Còn lớn hơn bằng
nhảy tới hàm so.
48
Xuất str5 ra màn hình.
.
Xuất str6 ra màn hình.
Xuất str7 ra màn hình.
Xuất str2 ra màn hình.
a0 = t0 1 sẽ lấy được kí tự đứng
trước. Sau đó xuất ra màn hình.
Xuất str3 ra màn hình.
lOMoARcPSD|27790909
17
lui $1, 0x00001001
ori $a0, $1, 28
syscall
addi $a0, $t0, 1
addi $v0, $zero, 11
syscall
addi $a0, $zero, 0
j exit
end:
addi $v0, $zero, 4
lui $1, 0x00001001
ori $a0, $1, 41
syscall
exit:
a0 = t0 + 1 sẽ lấy được kí tự đứng
sau. Sau đó xuất ra màn hình.
Xuất str4 ra màn hình.
lOMoARcPSD|27790909
18
lOMoARcPSD|27790909
19
H
nh 2.5: Sơ đồ giải thuật 1.3a Lab2
1.3b/
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ố.
B ng 2.7: Bài t p 1.3b
.data
str1: .asciiz "Nhap so thu 1: "#16
str2: .asciiz "\nNhap so thu 2: "#17
str3: .asciiz "\nSo lon hon: "#14
str4: .asciiz "\nTong: "#8
str5: .asciiz "\nHieu: " #8
str6: .asciiz "\nTich: "#8
str7: .asciiz "\nThuong: " #10
str8: .asciiz "\nHai so bang nhau."
.text
addi $v0, $zero, 4
lui $1, 0x00001001
ori $a0, $1, 0
syscall
addi $v0, $zero, 5
syscall
add $s1, $zero, $v0
addi $v0, $zero, 4 #xuat str2
lui $1, 0x00001001
ori $a0, $1, 16
syscall
addi $v0, $zero, 5
Khai báo các chuỗi.
Xuất str1 ra màn hình.
Nhập 1 số từ bàn phím vào và lưu
vào thành ghi s1.
Xuất str2 ra màn hình.
Nhập 1 số từ bàn phím và lưu vào
lOMoARcPSD|27790909
20
syscall
add $s2, $zero, $v0
beq $s1, $s2, bang
slt $t0, $s1, $s2
beq $t0, $zero, lon
addi $v0, $zero, 4
lui $1, 0x00001001
ori $a0, $1, 33
syscall
addi $v0, $zero, 1
addi $a0, $s2, 0
syscall
j main
lon:
addi $v0, $zero, 4
lui $1, 0x00001001
ori $a0, $1, 33
syscall
addi $v0, $zero, 1
addi $a0, $s1, 0
syscall
j main
bang:
addi $v0, $zero, 4
lui $1, 0x00001001
ori $a0, $1, 81
syscall
main:
add $t0, $s1, $s2 #Tong
addi $v0, $zero, 4
lui $1, 0x00001001
ori $a0, $1, 47
syscall
thanh ghi s2.
Nếu s1 = s2 thì nhảy tới bang.
Nếu s1 > s2 thì nhảy tới lon, s1 <
s2 thì tiếp tục chương trình.
Xuất str3 ra màn hình.
Xuất giá trị s2 ra màn hình.
Xuất str3 ra màn hình.
Xuất giá trị s1 ra màn hình.
Xuất str8 ra màn hình.
t0 = s1 + s2.
Xuất str4 ra màn hình.
lOMoARcPSD|27790909
21
addi $v0, $zero, 1
addi $a0, $t0, 0
syscall
sub $t0, $s1, $s2 #Hieu
addi $v0, $zero, 4
lui $1, 0x00001001
ori $a0, $1, 55
syscall
addi $v0, $zero, 1
addi $a0, $t0, 0
syscall
mul $t0, $s1, $s2 #Tich
addi $v0, $zero, 4
lui $1, 0x00001001
ori $a0, $1, 63
syscall
addi $v0, $zero, 1
addi $a0, $t0, 0
syscall
div $s1, $s2 #Thuong
mflo $t0
addi $v0, $zero, 4
lui $1, 0x00001001
ori $a0, $1, 71
syscall
addi $v0, $zero, 1
addi $a0, $t0, 0
syscall
Xuất giá trị t0 ra màn hình.
t0 = s1 - s2.
Xuất str5 ra màn hình.
Xuất giá trị t0 ra màn hình.
t0 = s1 * s2.
Xuất str6 ra màn hình.
Xuất giá trị t0 ra màn hình.
t0 = s1 / s2.
Xuất str7 ra màn hình.
Xuất giá trị t0 ra màn hình.
lOMoARcPSD|27790909
22
lOMoARcPSD|27790909
23
H
nh 2.6: Sơ đồ giải thuật 1.3b Lab2
Chương 3. CON TRỎ VÀ TRUY XUẤT BỘ NHỚ
1.1/ Lý thuyết.
1.1.1/ Nhắc lại về bộ nhớ.
- Dữ liệu được định nghĩa 1 byte(8 bits),1 half(2 bytes),1 word(4 bytes)
- 1 kí tự là 1 byte để lưu trữ (acsii).
- 1 số nguyên là 1 word để lưu trữ.
- 1 lệnh là 1 word (32 bits) để lưu trữ.
1.1.2/ Nhắc lại về khai báo biến,kiểu dữ liệu. <tên
biến>: .<kiểu dữ liệu> <danh sách các giá trị>
VD:
string1: .asciiz “UIT” #tạo 1 chuỗi tên string1 với khởi tạo “UIT”.
var1: .word 5 #khai báo 1 số nguyên tên var1 chiếm 1 word lưu trữ, có giá trị
khởi tạo là 5.
array1: .space 10 #tạo 1 mảng array1 có 10 bytes liên tục nhau, chưa khởi tạo giá
trị.
array2: .byte ‘a’, ‘b’ #tạo 1 mảng array2 có 2 phần tử, mỗi phần tử chiếm 1 byte,
khởi tạo giá trị là ‘a’, ‘b’.
1.1.3/ Mảng vào con trỏ.
- Con trỏ thao tác trên địa chỉ của bộ nhớ.
- Mảng thao tác trên chỉ số mảng. Vd: a[0]… a[n].
1.2/ Thực hành.
lOMoARcPSD|27790909
24
Mảng array1 có 10 word, kích thước được lưu trong size1; Mảng array2 có 16
byte, kích thước được lưu trong size2; Mảng array3 có 8 byte, kích thước được
lưu trong size3. Viết code trong phần “.text” thực hiện riêng từng phần việc: In
ra cửa sổ I/O của MARS tất cả các phần tử của mảng array1 và array2.
Gán các giá trị cho mảng array3 sao cho array3[i] = array2[i] + array2[size2
- 1 - i].
Người sử dụng nhập vào mảng thứ mấy và chỉ số phần tử cần lấy trong
mảng đó,chương trình xuất ra phần tử tương ứng.
B ng 3.8: Bài t p th c hành
STT
Ý nghĩa
MIPS
Yêu cầu
1:
In các
phần tử
của array1
và array2
.data
array1: .word 5, 6, 7, 8, 1, 2, 3, 9,
10
, 4
size1: .word 10
array2: .byte 1, 2, 3, 4, 5, 6, 7, 8, 9,
10
, 11, 12, 13, 14, 15,
16
size2: .word 16
array3: .space 8
size3: .word 8
string1: .asciiz "Mang 1: " #76
string2: .asciiz "\nMang 2: " #85
str4: .asciiz "\nNhap mang thu may:
" #95
str5: .asciiz "\nNhap phan tu thu
may: " #116
str6: .asciiz "\nPhan tu do la: " #140
.text
Khai báo biến
-
-
Xuất "Mang 1: "
lOMoARcPSD|27790909
25
#in array1
addi $v0,$zero,4
lui $1,0x00001001
ori $a0,$1,76
syscall
lui $1,0x00001001
addi $t1,$1,0
addi $t2,$1,40
work1:
lw $a0,0($t1)
addi $v0,$0,1
syscall
addi $t1,$t1,4
slt $t3,$t1,$t2
bne $t3,$0,work1
#in array2
addi $v0,$zero,4
lui $1,0x00001001
ori $a0,$1,85
syscall
addi $t1,$t1, 4
addi $t2,$t1, 16
addi $t3,$t2, 4
addi $t4,$t3, 8
addi $t8,$t2, 0
work2:
lb $a0,0($t1)
slt $t7,$t3,$t4
beq $t7,$0,work2.1
addi $t2,$t2,-1
lb $t5,0($t2)
add $t5,$t5,$a0
sb $t5,0($t3)
addi $t3,$t3,1
-
Khởi tạo con trỏ bằng địa chỉ đầu
tiên.
-
Chạy vòng lặp để xuất ra từng
phần tử trong array1
-
Xuất "\nMang 2: "
-
Đưa địa chỉ đầu của array2 vào
$t1
2
Đưa địa cuối của array2 vào $t
-
3
Đưa địa chỉ đầu của array3 vô $t
-
Đưa địa chỉ cuối của array3 vô
-
$t4
8
-
Gán cố định địa chỉ array2 vô $t
-
So sánh địa chỉ đầu cuối của
array3 nếu >= thì nhảy xuống
work2.1. Ngược lại làm tiếp điều
kiện bên dưới.
-
Gán array3 sao cho array3[i] =
array2[i] + array2[size2 - 1 - i]
-
Chạy vòng lặp để xuất ra từng
lOMoARcPSD|27790909
26
work2.1:
addi $t1,$t1,1
addi $v0,$0,1
syscall
slt $t6,$t1,$t8
bne $t6,$0,work2
phần tử trong array2.
Yêu cầu
2:
nhập
vào stt
mảng và
số phân tử
rồi xuất ra
phần tử đó
#Nhap
addi $v0,$zero,4
lui $1,0x1001
ori $a0,$1,95
syscall
addi $v0,$0,5
syscall
addi $s1,$v0,0
#nhap phan tu can lay
addi $v0,$zero,4
lui $1,0x00001001
ori $a0,$1,116
syscall
addi $v0,$0,5
syscall
addi $s2,$v0,0
#xuat phan tu
addi $v0,$zero,4
lui $1,0x00001001
ori $a0,$1,140
syscall
addi $t0,$0,1
beq $s1,$t0,else1
addi $t0,$t0,1
beq $s1,$t0,else2
addi $t0, $t0, 1
beq $s1,$t0, else3
else1:
sll $t2,$s2,2
add $t9,$1,$t2
lw $a0,0($t9)
Xuất "\nNhap mang thu may: "
-
-
Gọi hệ thống cho nhập stt mảng
rồi chuyển vào $s1
-
Xuất "\nNhap phan tu thu may: "
-
Gọi hệ thống cho nhập phần tử
rồi chuyển vào $s2
Xuất "\nPhan tu do la:
-
-
So sánh stt mảng nếu =1 thì nhảy
else1, =2 thì nhảy else2,=3 thì
nhảy else3
-
Dò trong mảng 1 rồi xuất ra phần
tử
lOMoARcPSD|27790909
27
j done
else2:
addi $t2,$s2,44
add $t9,$1,$t2
lb $a0,0($t9)
j done
else3:
addi $t2,$s2,64
add $t9,$1,$t2
lb $a0,0($t9)
done:
addi $v0,$0,1
syscall
-
Dò trong mảng 2 rồi xuất ra phần
tử
-
Dò trong mảng 3 rồi xuất ra phần
tử
lOMoARcPSD|27790909
28
H
nh 3.7: Sơ đồ giải thuật 1.2 Lab3
1.3/ Bài tập.
1.3a/
lOMoARcPSD|27790909
29
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ổ.
B ng 3.9: Bài t p 1.3a Lab3
.data
string1: .asciiz "Nhap so luong
phan tu: "#24
string2: .asciiz "\nNhap phan tu
thu "#19
string3: .asciiz ": " #3
string4: .asciiz "\nGia tri lon
nhat: "#20
string5: .asciiz "\nGia tri nho
nhat: "#20
string6: .asciiz "\nTong cac
phan tu: "#20
string7: .asciiz "\nNhap phan tu
thu: "#20
string8: .asciiz "\Phan tu do la:
"
array: .word
.text
lui $1,0x00001001
addi $a0,$1,0
Khai báo các chuỗi cần thiết.
Gán 0x00001001 vào $1.
Xuất string1 ra màn hình.
lOMoARcPSD|27790909
30
addi $v0,$0,4
syscall
addi $v0, $0, 5
syscall addi
$s1, $v0, 0
addi $t8, $1, 0
sll $t9, $s1, 2
add $t9, $t8,
$t9
in: addi $a0,$1,24 addi
$v0,$0,4#xuat string2
syscall
addi $t1, $t1, 1# xuat
stt addi $a0, $t1, 0 addi
$v0, $0, 1 syscall
addi $a0,$1,43 addi
$v0,$0,4#xuat string3
syscall
addi $v0, $0,
5 syscall sw
$v0, 0($t9)
addi $t8, $t8,
4 bne $t8, $t9,
in
addi $t9, $0, 1 #max
addi $t0, $1, 0
max1:
lw $t1, 0($t0)
Lưu số vừa nhập từ bàn phím vào
$s1 (độ dài mảng).
Gán 0x00001001 vào $t8.
$t9 = $s1 * 4.
Cho $t9 là địa chỉ giới hạn của
mảng.
Xuất string2 ra màn hình (Nhập
phần tử thứ).
Đếm số thứ tự rồi xuất ra màn
hình.
Xuất string3 ra màn hình ( : ) .
Lưu số nhập từ bàn phím vào $v0.
Gán giá trị của $v0 vào địa chỉ
$t8. $t8 += 4 (địa chỉ hiện tại dịch
lên 4 để sang địa chỉ kế tiếp). So
sánh địa chỉ hiện tại với địa chỉ
giới hạn. Nếu bằng thì tiếp tục
thực thi chương trình, ngược lại
nhảy lên in.
$t9 = 1.
$t0 là địa chỉ đầu tiên.
Gán giá trị ở địa chỉ $t0 vào $t1.
lOMoARcPSD|27790909
31
max2:
lOMoARcPSD|27790909
32
addi $t0, $t0, 4 beq
$t0, $t8, xuatmax lw
$t2, 0($t0)
slt $t9, $t2, $t1
bne $t9, $0, max2
j max1
xuatmax: addi $a0,$1,46
addi $v0,$0,4#xuat
string4 syscall
addi $a0, $t1, 0 addi
$v0, $0, 1 syscall
addi $t0, $1, 0#
MIN
min1: lw
$t1, 0($t0)
min2:
addi $t0, $t0, 4
beq $t0, $t8, xuatmin
Địa chỉ hiện tại dịch 4
để sang địa chỉ tiếp
theo. Nếu địa chỉ hiện
tại bằng địa chỉ giới hạn thì nhảy
tới xuatmax. Gán giá trị ở địa chỉ
$t0 vào $t2 ($t1 là giá trị phần tử
n thì $t2 là giá trị phần tử n + 1).
So sánh giá trị phần tử n và giá trị
phần tử n + 1.
Nếu $t1 (phần tử n) lớn hơn thì $t1
giữ nguyên, dịch $t2 sang địa chỉ
kế tiếp.
Nếu $t2 (phần tử n + 1) lớn hơn thì
$t1 sẽ giữ giá trị của $t2, $t2 sẽ
được dịch tới địa chỉ kế tiếp.
Xuất string4 ra màn hình.
Xuất max ra màn hình.
$t0 là địa chỉ đầu tiên.
Gán giá trị ở địa chỉ $t0 vào $t1.
Địa chỉ hiện tại dịch 4 để sang địa
chỉ tiếp theo.
Nếu địa chỉ hiện tại bằng địa chỉ
giới hạn thì nhảy tới xuatmin.
Gán giá trị ở địa chỉ $t0 vào $t2
lOMoARcPSD|27790909
33
lw $t2, 0($t0)
lOMoARcPSD|27790909
34
slt $t9, $t1, $t2
bne $t9, $0, min2
j min1
xuatmin: addi $a0,$1,66
addi $v0,$0,4#xuat
string5 syscall
addi $a0, $t1, 0
addi $v0, $0, 1
syscall
addi $t0, $1, 0#
tong addi $t1, $0, 0
tong: lw $t2, 0($t0)
add $t1, $t1, $t2
addi $t0, $t0, 4 bne
$t0, $t8, tong
addi $a0,$1,86 addi
$v0,$0,4#xuat string6
syscall
addi $a0, $t1,
0 addi $v0, $0,
1 syscall addi
$a0,$1,106
($t1 là giá trị
phần tử n thì
$t2 là giá trị phần tử n +
1).
So sánh giá trị phần tử n và giá trị
phần tử n + 1. Nếu $t1 (phần tử n)
nhỏ hơn thì $t1 giữ nguyên, dịch
$t2 sang địa chỉ kế tiếp.
Nếu $t2 (phần tử n + 1) nhỏ hơn
thì $t1 sẽ giữ giá trị của $t2, $t2 sẽ
được dịch tới địa chỉ kế tiếp.
Xuất string5 ra màn hình.
Xuất min ra màn hình.
$t0 là địa chỉ đầu tiên.
$t1 = 0.
Gán giá trị ở địa chỉ $t0 vào $t2.
$t1 += $t2.
Dịch lên 4 để sang địa chỉ kế tiếp.
Nếu địa chỉ hiện tại bằng địa chỉ
giới hạn thì tiếp tục chương trình,
ngược lại nhảy lên tong.
Xuất string6 ra màn hình.
Xuất tổng các phần tử ra màn hình.
lOMoARcPSD|27790909
35
addi $v0,$0,4#xuat string7
syscall
addi $v0, $0, 5
syscall
addi $s1, $v0, 0
addi $a0,$1,126
addi $v0,$0,4#xuat string8
syscall
sll $t0, $s1, 2
add $t1, $1, $t0
lw $a0, 0($t1)
addi $v0, $0, 1
syscall
Xuất string7 ra màn hình.
Lưu số nhập từ bàn phím vào $s1.
Xuất string8 ra màn hình.
$t0 = $s1 * 4.
$t1 là địa chỉ cần tìm.
Gán giá trị ở địa chỉ $t1 vào $a0.
Xuất $a0 ra mà hình.
lOMoARcPSD|27790909
36
lOMoARcPSD|27790909
37
H
nh 3.8: Sơ đồ giải thuật 1.3a Lab3
1.3b/
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ử). Mảng này gọi là A. Chuyển dòng lệnh C dưới đây sang mã assembly của
MIPS. Với các biến nguyên i, j được gán lần lượt vào thanh ghi $s0, $s1; và địa chỉ
nền của mảng số nguyên A được lưu trong thanh ghi $s3.
if (i<j) A[i] = i;
else A[i] = j;
lOMoARcPSD|27790909
38
B ng 3.10: Bài t p 1.3b Lab3
.data
str1: .asciiz "Nhap so luong phan
tu: "#24
str2: .asciiz "\nNhap phan tu thu
"#19
str3: .asciiz ": " #3
str4: .asciiz "\nNhap i: "#10
str5: .asciiz "\nNhap j: "#10
array: .word
.text
lui $1,0x00001001
addi $s3, $1, 0
addi $a0,$1,0
addi $v0,$0,4#xuat str1
syscall
addi $v0, $0, 5
syscall
addi $s1, $v0, 0
addi $t9, $1, 0
sll $t8, $s1, 2
add $t8, $t9, $t8
Khai báo các chuỗi cần thiết.
Gán 0x00001001 vào $1.
$s3 là địa chỉ đầu tiên.
Xuất str1 ra màn hình.
Lưu số nhập từ bàn phím vào $s1 (độ
dài mảng).
$t9 là địa chỉ đầu tiên.
$t8 = $s1 * 4.
$t8 là địa chỉ giới hạn của array.
lOMoARcPSD|27790909
39
IN:
addi $a0,$1,24
addi $v0,$0,4#xuat str2
syscall
addi $t1, $t1, 1# xuat stt
addi $a0, $t1, 0
addi $v0, $0, 1
syscall
addi $a0,$1,43
addi $v0,$0,4#xuat str3
syscall
addi $v0, $0, 5
syscall
sw $v0, 0($t9)
addi $t9, $t9, 4
bne $t9, $t8, IN
addi $a0,$1,46
addi $v0,$0,4#xuat str4
syscall
addi $v0, $0, 5
syscall
addi $s0, $v0, 0
addi $a0,$1,56
addi $v0,$0,4#xuat str5
syscall
addi $v0, $0, 5
syscall
addi $s1, $v0, 0
sll $t1, $s0, 2
Xuất str2 ra màn hình (Nhập phần tử
thứ).
Đếm số thứ tự rồi xuất ra màn hình (số
thứ tự).
Xuất str3 ra màn hình ( : ) .
Lưu số nhập từ bàn phím vào $v0.
Gán giá trị của $v0 vào địa chỉ $t9.
$t9 += 4 (địa chỉ hiện tại dịch lên 4 để
sang địa chỉ kế tiếp).
So sánh địa chỉ hiện tại với địa chỉ giới
hạn. Nếu bằng thì tiếp tục thực thi
chương trình, ngược lại nhảy lên IN.
Xuất str4 ra màn hình.
Lưu số nhập từ bàn phím vào $s0
).
(
nhập i
Xuất str5 ra màn hình.
Lưu số nhập từ bàn phím vào $s1
(
nhập j
).
$t1 = $s0 * 4.
lOMoARcPSD|27790909
40
H
nh 3.9: Sơ đồ giải thuật 1.3b Lab3
add $s3, $s3, $t1
slt $t0, $s0, $s1
beq $t0, $0, J
sw $s0, 0($s3)
j EXIT
J:
sw $s1, 0($s3)
EXIT:
$s3 là A[i].
So sánh i và j.
Nếu i nhỏ hơn j thì tiếp tục chương
trình, ngược lại nhảy xuống J.
Gán giá trị của $s0 vào địa chỉ $s3.
Gán giá trị của $s1 vào địa chỉ $s3.
lOMoARcPSD|27790909
41
Chương 4. THỦ TỤC VÀ HÀM CON
1.1/ Lý thuyết.
1.1.1/ Thứ tự của một thủ tục và hàm con:
+ Lệnh A.
+ Gọi thủ tục
Chuẩn bị đối số.
Lưu trạng thái.
Nhảy đến thủ tục.
+ Thực thi thủ tục
Thực thi
+ Quay về chương trình
chính Chuẩn bị kết
quả.
Quay về (tại lệnh kế tiếp).
+ Lệnh C.
1.1.2/ Cách thực thi trong thủ tục và hàm con:
+ Dùng ngăn xếp để lưu trữ các đối số (dùng $sp), ngăn xếp lưu từ địa cao
xuống địa chỉ thấp.
+ $pc : dùng để lưu địa chỉ tại lệnh đang thực thi.
+ Khôi phục các gia trị từ ngăn xếp vào lại thanh ghi.
+ Lệnh nhảy và lưu trạng thái của $pc : jal procedure ($ra = PC + 4).
+ Lệnh để quay về chương trình chính : jr $ra.
1.1.3/ Quy ước thanh ghi trong MIPS:
+ Thanh ghi đối số : $a0 - $a3.
+ Thanh ghi kết quả : $v0, $v1.
+ Thanh ghi tạm : $t0 - $t9.
+ Thanh ghi lưu trữ : $s0 - $s7.
+ Thanh ghi địa chỉ trả về : $ra.
+ Thanh ghi con trỏ ngăn xếp : $sp.
lOMoARcPSD|27790909
42
1.2
/ Thực hành với thủ tục.
.data
prompt: .asciiz "Enter one number: "
.text
main: jal getInt
move $s0,$v0
j exit
getInt:
li $v0,4
la $a0,prompt
syscall
li $v0,5
syscall
jr $ra
exit:
move $a0,$s0
move $a1,$s1
move $a2,$s2
move $a3,$s3
jal proc_example
move $a0,$v0
li $v0,1
syscall
proc_example:
addi $sp,$sp,-4
sw $s0,0($sp) #luu gia tri a vao sp
add $t0,$a0,$a1
add $t1,$a2,$a3
sub $s0,$t0,$t1
move $v0,$s0
lw $s0,0($sp)
addi $sp,$sp,4
jr $ra
lOMoARcPSD|27790909
43
Yêu cầu 1: Viết lại code trong Hình 1, thêm vào thủ tục tên showInt để in ra cửa sổ
I/O giá trị của số int nhập vào cộng thêm 1.
B ng 4.11: Code trong Yêu cầồu 1
STT
Code MIPS
Hình 1
.data
prompt: .asciiz "Enter one number:
"
.text
main: jal getInt
move $s0,$v0
j exit
getInt:
li $v0,4
la $a0,prompt
syscall
li $v0,5
syscall
jr $ra
exit:
showInt:
addi $v0,$v0,1
add $a0,$v0,$0
li $v0,1
syscall
-
Code mẫu
-
Xuất ra số nguyên
lOMoARcPSD|27790909
44
H
nh 4.10: S đồồ gi i thu t Yêu cầồu 1ơ
Yêu cầu 2: Viết lại code trong Hình 2, lúc này chương trình chính cần tính giá trị
của cả hai biểu thức: (a + b) (c + d) và (a b) + (c d), hàm proc_example có hai
giá trị trả về và trong thân hàm sử dụng hai biến cục bộ $s0 và $s1 ($s1 lưu kết quả
của (a b) + (c d)).
lOMoARcPSD|27790909
45
B ng 4.12 : Code trong Yêu cầồu 2
Hình 2
Tính (a + b) (c + d),
(
)
a - b) + (c d
.data
string1: .asciiz "nhap a: "
string2: .asciiz "nhap b: "
string3: .asciiz "nhap c: "
string4: .asciiz "nhap d: "
#nhap a
li $v0,4
la $a0,string1
syscall
li $v0,5
syscall
move $s0,$v0
#nhap b
li $v0,4
la $a0,string2
syscall
li $v0,5
syscall
move $s1,$v0
#nhap c
li $v0,4
la $a0,string3
syscall
li $v0,5
syscall
move $s2,$v0
#nhap d
li $v0,4
la $a0,string4
syscall
lOMoARcPSD|27790909
46
li $v0,5
syscall
move $s3,$v0
move $a0,$s0
move $a1,$s1
move $a2,$s2
move $a3,$s3
jal proc_example
# (a + b) (c - d)
move $a0,$v0
li $v0,1
syscall
#(a - b) + (c + d)
move $a0,$v1
li $v0,1
syscall
j exit
proc_example:
addi $sp,$sp,-4
sw $s0,0($sp) #luu gia tri a vao sp
add $t0,$a0,$a1
add $t1,$a2,$a3
sub $s0,$t0,$t1
move $v0,$s0
lw $s0,0($sp) # trả giá trị a lại $s0
addi $sp,$sp,4
addi $sp,$sp,-8
sw $s0,0($sp) #luu gia tri b vao sp
sub $t2,$a0,$a1
sub $t3,$a2,$a3
add $s1,$t2,$t3
move $v1,$s1
lw $s1,0($sp) #trả giá trị b lại $s1
addi $sp,$sp,8
jr $ra
exit:
lOMoARcPSD|27790909
47
H
nh 4.11: S đồồ gi i thu t Yêu cầồu 2ơ
Yêu cầu 3: Viết lại code trong Hình 2, lúc này chương trình chính cần tính giá trị
của cả hai biểu thức: (a + b) (c + d), (e - f) hàm proc_example có 6 input và hai
giá trị trả về và trong thân hàm sử dụng hai biến cục bộ $s0 và $s1 ($s1 lưu kết quả
của e - f).
B ng 4.13: Code trong Yêu cầồu 3
Tính (a + b) (c + d),
(e - f)
.data
string1: .asciiz "nhap a: "
string2: .asciiz "nhap b: "
string3: .asciiz "nhap c: "
string4: .asciiz "nhap d: "
string5: .asciiz "nhap e: "
string6: .asciiz "nhap f: "
.text
#nhap a
li $v0,4
la $a0,string1
lOMoARcPSD|27790909
48
syscall
li $v0,5
syscall
move $s0,$v0
#nhap b
li $v0,4
la $a0,string2
syscall
li $v0,5
syscall
move $s1,$v0
#nhap c
li $v0,4
la $a0,string3
syscall
li $v0,5
syscall
move $s2,$v0
#nhap d
li $v0,4
la $a0,string4
syscall
li $v0,5
syscall
move $s3,$v0
#nhap e
li $v0,4
la $a0,string5
syscall
li $v0,5
syscall
move $s4,$v0
#nhap f
li $v0,4
la $a0,string6
syscall
li $v0,5
syscall
lOMoARcPSD|27790909
49
move $s5,$v0
move $a0,$s4
move $a1,$s5
move $a2,$s2
move $a3,$s3
addi $sp,$sp,-4
sw $a0,0($sp) #luu gia tri cua e
vao sp
move $a0,$s0 #dua a vao lai a0
addi $sp,$sp,-4
sw $a1,0($sp) #luu gia tri cua f
vao sp
move $a1,$s1 # dua b vao lai
a1
jal proc_example
#xuat (a+b)-(c+d)
move $a0,$v0
li $v0,1
syscall
#xuat (e-f)
move $a0,$v1
li $v0,1
syscall
j exit
proc_example:
addi $sp,$sp,-4
sw $s0,0($sp) #luu gia tri a vao
sp
add $t0,$a0,$a1
add $t1,$a2,$a3
sub $s0,$t0,$t1
move $v0,$s0
lw $s0,0($sp)#khoi phuc gia tri
a
lOMoARcPSD|27790909
50
H
nh 4.12: S đồồ gi i thu t Yêu cầồu 3ơ
addi $sp,$sp,4
lw $a1,0($sp) #dua gia tri f vao
a1
addi $sp,$sp,4
lw $a0,0($sp) #dua gia tri e vao
a0
addi $sp,$sp,-8
sw $s1,0($sp) #luu gia tri b vao
sp
sub $s1,$a0,$a1
move $v1,$s1
lw $s1,0($sp) #khoi phuc gia
tri b
addi $sp,$sp,8
jr $ra
exit:
lOMoARcPSD|27790909
51
1.3/ Thực hành với đệ quy.
Viết code MIPS, chạy kiểm thử trên MARS và giải thích ý nghĩa rõ ràng cho
chương trình tính giai thừa được viết bằng code C như Hình 3.
B ng 4.14: Code Th c hành v i đ quy
.data
str: .asciiz "The factorial of 10 is %d\n:
"
.text
main:
lui $1, 0x00001001
addi $a0, $1, 0
addi $v0, $0, 4
syscall
addi $a0, $0, 10
jal fact
addi $a0, $v0, 0
addi $v0, $0, 1
syscall
j exit
fact:
addi $sp, $sp, -4
sw $ra, 0($sp)
addi $t0, $a0, 0
fact1:
lOMoARcPSD|27790909
52
H
nh 4.13: S đồồ gi i thu t 1.3 Lab4ơ
1.4/ Bài tập.
1.4a/
Tiếp tục nội dung 2. Vẽ lại hình ảnh của các stack trong trường hợp tính 5! và 10!.
addi $a0, $a0, -1
beq $a0, $0, return
mul $t0, $t0, $a0
jal fact1
return:
lw $ra, 0($sp)
addi $v0, $t0, 0
jr $ra
exit:
lOMoARcPSD|27790909
53
H
nh 4.14: Stack trong trườ ng h p 5!
lOMoARcPSD|27790909
54
H
nh 4.15: Stack trong trườ ng h p 10!
lOMoARcPSD|27790909
55
TÀI LIỆU THAM KHẢO
1. KTMT---UIT, T ng quát h p ng kiên trúc MIPS, TP.HCM, 2014.
2. KTMT--- UIT, MARS - chương tr
nh m ph ng assembly MIPS, TP.HCM,
2013.
3. KTMT--- UIT, M t sồắ l nh assembly MIPS c b n. ơ
Cám ơn đã đọc!

Preview text:

lOMoARcPSD| 27790909
ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA KỸ THUẬT MÁY TÍNH BÁO CÁO MÔN HỌC
THỰC HÀNH KIẾN TRÚC MÁY TÍNH CE119.L12.MTCL.1
GIẢNG VIÊN HƯỚNG DẪN: TRẦN ĐẠI DƯƠNG
SINH VIÊN THỰC HIỆN: NGUYỄN TUẤN ANH – 19520794
TP. HỒ CHÍ MINH, 12/2020 Downloaded by M? M? (nguyenmo081102@gmail.com) lOMoARcPSD| 27790909 MỤC LỤC
Chương 1. LÀM QUEN VỚ ẬI L P TRÌNH HP NG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1/ Lý thuyết. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .1
1.1.1/ Bộ nhớ.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1
1.1.2/ Biểu diễn thông tin.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1
1.1.3/ Thanh ghi.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1
1.1.4/ Cấu trúc của 1 chương trình.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1.5/ Khai báo dữ liệu,biến.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 2
1.2/ Thực hành.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . 3
1.2.1/ Sinh viên tìm hiểu tài liệu “Một số lệnh assembly MIPS cơ bản”. . . . . . . 3
1.2.2/ Mô phỏng các chương trình bên dưới và cho biết ý nghĩa:. . . . . . . . . . . . . . 5
1.3/ Bài tập.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . .7
1.3.1/ Nhập vào một chuỗi, xuất ra cửa sổ I/O của MARS theo từng yêu cầu
sau:. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . 7 Chương 2.
CẤẤU TRÚC ĐIỀỀU KHI N
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
1.1/ Lý thuyết.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . 10
1.1.1/ Cấu trúc if – else.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
1.1.2/ Cấu trúc switch – case.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.1.3/ Cấu trúc vòng lặp for.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
1.2/ Thực hành.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 11
1.2.1/ 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ả:. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 I lOMoARcPSD| 27790909
1.2.2/. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . .14
1.3/ Bài tập.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..15
1.3a/. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15
1.3b/. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . 20
Chương 3. CON TR VÀ TRUY XUẤẤT BỘ Ớ NH
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.1/ Lý thuyết.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . 24
1.1.1/ Nhắc lại về bộ nhớ.. . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 24
1.1.2/ Nhắc lại về khai báo biến,kiểu dữ liệu.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24
1.1.3/ Mảng vào con trỏ.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.2/ Thực hành.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 25
1.3/ Bài tập.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . .32
1.3a/. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 32
1.3b/. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . 38
Chương 4. THỦ Ụ T C VÀ HÀM CON. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41
1.1/ Lý thuyết.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . 41
1.1.1/ Thứ tự của một thủ tục và hàm con:. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41
1.1.2/ Cách thực thi trong thủ tục và hàm con:. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41
1.1.3/ Quy ước thanh ghi trong MIPS:. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41
1.2/ Thực hành với thủ tục.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
1.3/ Thực hành với đệ quy.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
1.4/ Bài tập.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . .59
1.4a/. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . 59 II lOMoARcPSD| 27790909
1.4b/. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 60 DANH MỤC HÌNH ẢNH Hnh 1.1: Sơ đồ giải thuật 1.3.1a
Lab1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7 H nh 1.2: Sơ đồ giải thuật
1.3.1d Lab1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Hnh 2.1: Sơ đồ giải thuật 1.2.1
Lab2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 Hnh 2.2: Sơ đồ giải thuật 1.2.2
Lab2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15 Hnh 2.3: Sơ đồ giải thuật 1.3a
Lab2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Hnh 2.4: Sơ đồ giải thuật 1.3b
Lab2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Hnh 3.1: Sơ đồ giải thuật 1.2
Lab3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Hnh 3.2: Sơ đồ giải thuật 1.3a
Lab3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Hnh 3.3: Sơ đồ giải thuật 1.3b
Lab3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
H nh 4.1: S đồồ gi i thu t Yêu cầồu 1ơ ả ậ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
H nh 4.2: S đồồ gi i thu t Yêu cầồu 2ơ ả ậ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
H nh 4.3: S đồồ gi i thu t Yêu cầồu 3ơ ả ậ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 III lOMoARcPSD| 27790909
H nh 4.4: S đồồ gi i thu t 1.3 Lab4ơ ả ậ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Hnh 4.5: Stack trong trườ ợng h p
5!... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 H nh 4.6: Stack trong trườ ợng
h p 10!.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62 DANH MỤC BẢNG
B ng 1.1: L nh Assembly c b nệ ơ ả
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
B ng 1.2: Chương trình mẫu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .5
B ng 1.3: Biểu diễn thông tin trong bộ nhớ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 B ng 2.1: Chuy n đo n codeể ạ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 B ng 2.2: Chuy n đo n code
2.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
B ng 2.3: Bài t p 1.3.a. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
B ng 2.4: Bài t p 1.3.b. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . 20 B ng 3.1: Bài t p th c hànhậ ự
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 B ng 3.2: Bài t p 1.3.a Lab
3.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32 B ng 3.3: Bài t p 1.3.b Lab
3.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38 B ng 4.1
: Code trong Yêu cầuồ
1.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44
B ng 4.2 : Code trong Yêu cầồu 2.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 B ng 4.3: Code trong Yêu cầuồ
3.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52 B ng 4.4: Code Th c hành v i
đ quy
ự ớ ệ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .58 IV lOMoARcPSD| 27790909
Chương 1. LÀM QUEN VỚI LẬP TRÌNH HỢP NGỮ 1.1/ Lý thuyết 1.1.1/ Bộ nhớ.
- Dữ liệu được định nghĩa 1 byte(8 bits),1 half(2 bytes),1 word(4 bytes)
- 1 kí tự là 1 byte để lưu trữ (acsii)
- 1 số nguyên là 1 word để lưu trữ- 1 lệnh là 1 word (32 bits) để lưu trữ
1. 1.2/ Biểu diễn thông tin. - Ký số:
+ Hệ thập phân: 9,10,…
+ Hệ thập lục phân: thêm tiền tố 0x. Vd: 0x20.
- Ký tự: đặt trong ngoặc nháy đơn. Vd: ‘a’.
- Chuỗi: đặt trong cặp nháy kép. Vd: “UIT” (kết thúc chuỗi là kí tự null). 1. 1.3/ Thanh ghi.
- Có 32 thanh ghi đa dụng (thanh ghi 32 bit).
- Biểu diễn: tiền tố $ theo sau là chỉ số hoặc tên của thanh ghi ($0 hoặc $t1).
- Thanh ghi Hi và Lo được dành riêng cho phép nhân và phép chia
+ mfhi, mflo (move from hi/lo). - Quy ước:
+ $at dành cho assembler, $k0 và $k1 dành cho hệ điều hành.
+ $gp, $sp, $fp, $ra dành cho các mục đích riêng biệt, không nên sử dụng để lưu trữ
tạm trong quá trình tính toán và lập trình.
1. 1.4/ Cấu trúc của 1 chương trình.
Muốn chú thích trong MIPS dùng # 1 lOMoARcPSD| 27790909 .data #khai báo biến. #khai báo dữ liệu .text
#viết chương trình sau .text main:
#nhãn để cho người dùng biết nơi bắt đầu chương trình.
#viết chương trình sau đây.
1.1.5/ Khai báo dữ liệu,biến. : . VD:
string1: .asciiz “UIT” #tạo 1 chuỗi tên string1 với khởi tạo “UIT”.
var1: .word 5 #khai báo 1 số nguyên tên var1 chiếm 1 word lưu trữ, có giá trị khởi tạo là 5.
array1: .space 10 #tạo 1 mảng array1 có 10 bytes liên tục nhau, chưa khởi tạo giá trị.
array2: .byte ‘a’, ‘b’ #tạo 1 mảng array2 có 2 phần tử, mỗi phần tử chiếm 1 byte,
khởi tạo giá trị là ‘a’, ‘b’.
1.2/ Bài tập thực hành.
1.2.1/ Sinh viên tìm hiểu tài liệu “Một số lệnh assembly MIPS cơ bản”
Mô phỏng việc thực thi các lệnh và cho biết chức năng của các lệnh cơ bản sau: add,
addi, addu, addiu, sub, subu, and, andi, or, nor, lw, sw, slt, slti, sltu, sltiu, syscall.
B ng 1.1: Nh ng l nh Assembly c b nữ ệ ơ ả ST Lệnh Ý Nghĩa VD 2 lOMoARcPSD| 27790909 T 1
Add Cộng 2 giá trị của 2 thanh ghi, lưu vào thanh ghi Add $s0, $s1, $s2 thứ nhất 2
Addi Add immediate – Cộng giá trị trong thanh ghi Addi $s0, $s1, 5
thứ 2 với một hằng số 16bit có dấu, lưu vào thanh ghi thứ nhất 3
Addu Add Unsigned – Cộng giá trị không dấu trong Addu $s0, $s1, $s2
thanh ghi thứ 2, lưu vào thanh ghi thứ nhất (Không bị tràn bit) 4
Addiu Add Immediate Unsigned – Công giá trị không Addiu $s0, $s1, -5
dấu trong thanh ghi thứ 2 với hằng số 16bit có dấu, lưu vào thanh ghi thứ nhất (Không bị tràn bit) 5
Sub Lấy giá trị của thanh ghi thứ 2 trừ cho giá trị Sub $s0, $s1, $s2
thanh ghi thứ 3 sau đó lưu giá trị vào thanh ghi thứ nhất 6
Subu Sub unsigned – Gía trị không dấu trong thanh Subu $s0, $s1, $s2
ghi thứ 2 trừ cho giá trị không dấu trong thanh ghi thứ 3 sau đó lưu giá trị vào thanh ghi thứ nhất 7
And And từng bit trong thanh ghi thứ 2 với thanh ghi And $s0,
$s1, $s2 thứ 3 sau đó lưu lại vào thanh ghi thứ nhất 8
Andi And immediate – and từng bit trong thanh ghi Andi $s0, $s1, $s2
thứ 2 với hằng số sau khi đổi ra mã nhịn phân theo thứ tự với nhau sau đó
lưu lại vào thanh ghi thứ nhất 9 Or
Or từng bit trong thanh ghi thứ 2 với thanh ghi Or $s0, $s1, $s2 thứ
3 theo thứ tự với nhau sau đó lưu lại vào thanh ghi thứ nhất 10
Nor Or từng bit trong thanh ghi thứ 2 với thanh ghi Nor $s0, $s1, $s2
thứ 3 theo thứ tự với nhau, sau đó not lại rồi lưu vào thanh ghi thứ nhất 11 Lw
Load word – Lấy giá trị ở địa chỉ bộ nhớ đã Lw $s0 4($s1) được
chỉ định để lưu vào thanh ghi 12 Sw
Store word – Lấy giá trị trong thanh ghi lưu vào Sw $s0
4($s1) bộ nhớ với giá trị đã được chỉ định 13 Slt
Set less than – Nếu giá trị trong thanh ghi thứ 2 Slt $s0, $s1, $s2 bé
hơn giá trị trong thanh ghi thứ 3 thì giá trị trong thanh ghi thứ nhất bằng 1, ngược lại thì bằng 0 14 Slti
Set less than immediate – Nếu giá trị trong thanh Slti $s0, $s1,
5 ghi thứ 2 bé hơn hằng số thì giá trị trong thanh ghi thứ nhất bằng 1, ngược
lại nếu lớn hơn thì bằng 0 15
Sltu Set less than unsigned – nếu giá trị không dấu Sltu $s0, $s1, $s2
trong thanh ghi thứ 2 bé hơn giá trị không dấu trong thanh ghi thứ 3 thì giá trị trong thanh ghi
thứ nhất bằng 1, ngược lại nếu lớn hơn thì bằng 0 3 lOMoARcPSD| 27790909 16
Sltiu Set less than immediate unsigned – nếu giá trị Sltiu $s0, $s1, -5
không dấu trong thanh ghi thứ 2 bé hơn hằng số thì giá trị trong thanh ghi thứ nhất
bằng 1, ngược lại nếu lớn hơn thì bằng 0 17 syscall
Thực thi lệnh gọi hệ thống
1.2.2/ Mô phỏng các chương trình bên dưới và cho biết ý nghĩa:
B ng 1.2: Chương trình ví dụ ST VD Giải thích T 1 .data var1: .word 23
Var1 là biến nguyên 4 byte, giá trị khởi tạo là 23 .text start: lw $t0, var1
Lưu giá trị ở 23 trong bộ nhớ vào trong thanh ghi $t0 Cho $t1 = 5 li $t1, 5
Lưu giá trị trong thanh ghi $t1 vào địa chỉ 23 trong sw $t1, var1 bộ nhớ 2 .data array1:.space 12
Khai báo mảng array1 có 12byte .text start: la $t0, array1
Gán mảng array1 vào thanh ghi $t0 li $t1, 5 Cho $t1 = 5 sw $t1, ($t0)
Lưu giá trị của $t1 vào ô nhớ địa chỉ là giá trị của $t0 Cho $t1 = 13 4 lOMoARcPSD| 27790909 li $t1, 13
Lưu giá trị của $t1 vào ô nhớ địa chỉ là 4 cộng giá trị sw $t1, 4($t0) của $t0 Cho $t1 = -7 li $t1, -7
Lưu giá trị của $t1 vào ô nhớ địa chỉ là 8 công giá trị sw $t1, 8($t0) của $t0 3 Li $v0,5 Nhập một số nguyên syscall 4 .data
String1: .ascii “Print this.\n”
Khai báo chuồỗi đ c g
ắắn sắnỗ “Print this” .text Main: li $v0,4 La $a0, string1 Xuầắt chuồỗi syscall Gán string1 vào $a0 1.3/ Bài tập.
1.3.1/ Nhập vào một chuỗi, xuất ra cửa sổ I/O của MARS theo từng yêu cầu sau:
a) Khai báo và xuất ra cửa sổ I/O 2 chuỗi có giá trị như sau:
- Chuỗi 1: Chao ban! Ban la sinh vien nam thu may?
- Chuỗi 2: Hihi, minh la sinh vien nam thu 1 ^-^ 5 lOMoARcPSD| 27790909
H nh 1.1: Sơ đồ giải thuật 1.3.1a Lab1
b) Biểu diễn của 2 chuỗi trên dưới bộ nhớ là gì?
B ng 1.3: Biểu diễn thông tin trong bộ nhớ 0x6f616843 oahC
0x6e616220 nab(khoảng trống) 0x61422021 aB(Khoảng trống)!
0x616c206e al(Khoảng trống)n 0x6e697320 nis(Khoảng trống) 0x69762068
iv(khoảng trống)h 0x6e206e65 n(khoảng trống)ne 0x74206d61 t(khoang trống)ma 6 lOMoARcPSD| 27790909 0x6d207568 m(khoảng trống)uh 0x0a3f7961 (khoảng trống)?ya 0x68694800 hiH (khoảng xuống dòng) 0x6d202c69
m(khoảng trống),i 0x20686e69 (khoảng trống)hni 0x7320616c s(khoảng trống)al 0x20686e69 (khoảng trống)hni neiv 0x6e656976 0x6d616e20 man(khoảng trống) 0x75687420 uht(khoảng trống) 0x5e203120
^(khoảng trống)1(khoảng trống) ^- 0x00005e2d
c) Xuất ra lại đúng chuỗi đã nhập. Ví dụ:
Nhap: Truong Dai hoc Cong nghe Thong tin
Xuất: Truong Dai hoc Cong nghe Thong tin 7 lOMoARcPSD| 27790909
Hình 1.1: Sơ đồ giải thuật 1.3.1c Lab1
d) Nhập vào 2 số nguyên sau đó xuất tổng của 2 số nguyên này. 8 lOMoARcPSD| 27790909
H nh 1.2: Sơ đồ giải thuật 1.3.1d Lab1
Chương 2. CẤU TRÚC ĐIỀU KHIỂN 1.1/ Lý thuyết.
1.1.1/ Cấu trúc if – else.
Đầu tiên thực hiện việc so sánh điều kiện + So sánh bằng + So sánh không bằng
+ So sánh bé hơn, bé hơn hoặc bằng
+ So sánh lớn hơn, lớn hơn hoặc bằng 9 lOMoARcPSD| 27790909
- Nếu điều kiện đúng, thực hiện lệnh và có thể là đoạn lệnh ở bên trong, nếu
sai thì tới điều kiện tiếp theo hoặc kết thúc chương trình.
1.1.2/ Cấu trúc switch – case.
- Kiếm tra điều kiện để đưa vào trường hợp đúng, có thể chuyển thành cấu trúc if, if- else.
1.1.3/ Cấu trúc vòng lặp for.
- Kiếm tra điều kiện, để quyết định có nhảy hay không, điều kiện không thỏa thì kết thúc chương trình. 1.2/ Thực hành.
1.2.1/ 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ả:
(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).
B ng 2.4: Chuy n đo n codeể ạ 10 lOMoARcPSD| 27790909 Code mẫu MIPS Ý nghĩa if (i == j) bne $s0, $s1, else
- So sánh i và j, nếu không bằng thì f = g + h; nhảy đến else else add $s2,$t0,$t1 - Thực hiện g + h f = g – h; j exit - Nhảy tới exit else: - Lệnh else : sub $s2,$t0,$t1 - Thực hiện g- h exit: Kết thúc 11 lOMoARcPSD| 27790909
H nh 2.3: Sơ đồ giải thuật 1.2.1 Lab2 1.2.2/
(Với giá trị của i, N, Sum lần lượt chứa trong các thanh ghi $s0, $s1, $s2) 12 lOMoARcPSD| 27790909
B ng 2.5: Chuy n đo n code ể ạ2 addi $s2,$zero,0 - Khởi tạo giá trị Sum addi $s0,$zero,1 - Khởi tạo giá trị i loop: slt $a0,$s0,$s1 So sánh i < - N int Sum = 0 beq $s0,$s1, work So sánh i = - N thì nhảy đến work for (int i = 1; i beq $a0,$zero,exit
- So sánh kết quả của i<=N; ++i){ add $s2,$s2,$s0 thì nhảy đến exit Sum = Sum + i; addi $s0,$s0,1 - Sum = Sum + i } j loop - i = i +1 work: - Nhảy loop add $s2,$s2,$s0 - Sum = Sum + i addi $s0,$s0,1 - i = i +1 exit: 13 lOMoARcPSD| 27790909
H nh 2.4: Sơ đồ giải thuật 1.2.2 Lab2 1.3/ Bài tập. 1.3a/
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:
- Ví dụ: Nhap ky tu (chỉ một ký tự): b Ky tu truoc: a Ky tu sau: c 14 lOMoARcPSD| 27790909
- Ký tự nhập vào là: hoa, thường, số. Nhập vào loại nào thì xuất ra loại đó. Nếu
không phải 3 loại trên thì xuất “invalid type”.
B ng 2.6: Bài t p 1.3a
.data string1: .asciiz "Nhap ki tu: " Khai báo các chuỗi.
string2: .asciiz "\nKi tu truoc: "
string3: .asciiz "\nKi tu sau: "
string4: .asciiz "\ninvalid type" string5: .asciiz "\nLoai so" string6: .asciiz "\nLoai chu"
string7: .asciiz "\nLoai chu hoa" .text addi $v0, Xuất string1 ra màn hình. $zero, 4 lui $1, 0x00001001 ori $a0, $1, 0 syscall addi $v0, $zero, 12
Nạp 1 kí tự từ bàn phím vào và syscall addi $t0, lưu ở thanh ghi v0. $v0, 0
Chuyển giá trị cho thanh ghi t0. slti $t1, $t0, 123 # >122
Nếu giá trị của t0 lớn hơn 122 beq $t1, $zero, end nhảy tới end. slti $t1, $t0, 97 bne
Nếu giá trị của t0 nhỏ hơn 97 $t1, $zero, work1 j
nhảy tới work1. Còn lớn hơn bằng chu
97 thì nhảy tới hàm chu. work1:
Nếu giá trị của t0 lớn hơn bằng 91 slti $t2, $t0, 91
nhảy tới end. Còn nhỏ hơn 91 thì beq $t2, $zero, end nhảy tới work2. j work2 work2:
Nếu giá trị của t0 nhỏ hơn 65
slti $t1, $t0, 65 # 58< <64
nhảy tới work3. Còn lớn hơn bằng bne $t1, $zero, work3 j
65 thì nhảy tới hàm chuhoa. chuhoa 15 lOMoARcPSD| 27790909 work3:
Nếu giá trị của t0 lớn hơn bằng 58 slti $t2, $t0, 58
nhảy tới end. Còn nhỏ hơn 58 thì beq $t2, $zero, end nhảy tới work4 j work4 work4:
Nếu giá trị của t0 nhỏ hơn 48 slti $t1, $t0, 48 # <48
nhảy tới end. Còn lớn hơn bằng bne $t1, $zero, end 48 nhảy tới hàm so. j so so: Xuất str5 ra màn hình. addi $v0, $zero, 4 . lui $1, 0x00001001 ori $a0, $1, 55 syscall j main chu: Xuất str6 ra màn hình. addi $v0, $zero, 4 lui $1, 0x00001001 ori $a0, $1, 64 syscall j main chuhoa: Xuất str7 ra màn hình. addi $v0, $zero, 4 lui $1, 0x00001001 ori $a0, $1, 74 syscall j main main: Xuất str2 ra màn hình. addi $v0, $zero, 4 #xuat str2 lui $1, 0x00001001 ori $a0, $1, 13 syscall
a0 = t0 – 1 sẽ lấy được kí tự đứng addi $a0, $t0, -1
trước. Sau đó xuất ra màn hình. addi $v0, $zero, 11 syscall addi $v0, $zero, 4 #xuat str3 Xuất str3 ra màn hình. 16 lOMoARcPSD| 27790909 lui $1, 0x00001001 ori $a0, $1, 28 syscall
a0 = t0 + 1 sẽ lấy được kí tự đứng addi $a0, $t0, 1
sau. Sau đó xuất ra màn hình. addi $v0, $zero, 11 syscall addi $a0, $zero, 0 j exit end: Xuất str4 ra màn hình. addi $v0, $zero, 4 lui $1, 0x00001001 ori $a0, $1, 41 syscall exit: 17 lOMoARcPSD| 27790909 18 lOMoARcPSD| 27790909
H nh 2.5: Sơ đồ giải thuật 1.3a Lab2 1.3b/
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ố.
B ng 2.7: Bài t p 1.3b .data
str1: .asciiz "Nhap so thu 1: "#16 Khai báo các chuỗi.
str2: .asciiz "\nNhap so thu 2: "#17
str3: .asciiz "\nSo lon hon: "#14 str4: .asciiz "\nTong: "#8 str5: .asciiz "\nHieu: " #8 str6: .asciiz "\nTich: "#8
str7: .asciiz "\nThuong: " #10
str8: .asciiz "\nHai so bang nhau." .text addi $v0, $zero, 4 Xuất str1 ra màn hình. lui $1, 0x00001001 ori $a0, $1, 0 syscall addi $v0, $zero, 5
Nhập 1 số từ bàn phím vào và lưu syscall vào thành ghi s1. add $s1, $zero, $v0 addi $v0, $zero, 4 #xuat str2 Xuất str2 ra màn hình. lui $1, 0x00001001 ori $a0, $1, 16 syscall addi $v0, $zero, 5
Nhập 1 số từ bàn phím và lưu vào 19 lOMoARcPSD| 27790909 syscall thanh ghi s2. add $s2, $zero, $v0 beq $s1, $s2, bang
Nếu s1 = s2 thì nhảy tới bang. slt $t0, $s1, $s2
Nếu s1 > s2 thì nhảy tới lon, s1 < beq $t0, $zero, lon
s2 thì tiếp tục chương trình. addi $v0, $zero, 4 Xuất str3 ra màn hình. lui $1, 0x00001001 ori $a0, $1, 33 syscall
Xuất giá trị s2 ra màn hình. addi $v0, $zero, 1 addi $a0, $s2, 0 syscall j main lon: addi $v0, $zero, 4 Xuất str3 ra màn hình. lui $1, 0x00001001 ori $a0, $1, 33 syscall addi $v0, $zero, 1
Xuất giá trị s1 ra màn hình. addi $a0, $s1, 0 syscall j main bang: addi $v0, $zero, 4 Xuất str8 ra màn hình. lui $1, 0x00001001 ori $a0, $1, 81 syscall main: add $t0, $s1, $s2 #Tong t0 = s1 + s2. addi $v0, $zero, 4 Xuất str4 ra màn hình. lui $1, 0x00001001 ori $a0, $1, 47 syscall 20 lOMoARcPSD| 27790909 addi $v0, $zero, 1
Xuất giá trị t0 ra màn hình. addi $a0, $t0, 0 syscall sub $t0, $s1, $s2 #Hieu t0 = s1 - s2. addi $v0, $zero, 4 Xuất str5 ra màn hình. lui $1, 0x00001001 ori $a0, $1, 55 syscall addi $v0, $zero, 1
Xuất giá trị t0 ra màn hình. addi $a0, $t0, 0 syscall mul $t0, $s1, $s2 #Tich t0 = s1 * s2. addi $v0, $zero, 4 Xuất str6 ra màn hình. lui $1, 0x00001001 ori $a0, $1, 63 syscall addi $v0, $zero, 1
Xuất giá trị t0 ra màn hình. addi $a0, $t0, 0 syscall div $s1, $s2 #Thuong t0 = s1 / s2. mflo $t0 addi $v0, $zero, 4 Xuất str7 ra màn hình. lui $1, 0x00001001 ori $a0, $1, 71 syscall addi $v0, $zero, 1
Xuất giá trị t0 ra màn hình. addi $a0, $t0, 0 syscall 21 lOMoARcPSD| 27790909 22 lOMoARcPSD| 27790909
H nh 2.6: Sơ đồ giải thuật 1.3b Lab2
Chương 3. CON TRỎ VÀ TRUY XUẤT BỘ NHỚ 1.1/ Lý thuyết.
1.1.1/ Nhắc lại về bộ nhớ.
- Dữ liệu được định nghĩa 1 byte(8 bits),1 half(2 bytes),1 word(4 bytes)
- 1 kí tự là 1 byte để lưu trữ (acsii).
- 1 số nguyên là 1 word để lưu trữ.
- 1 lệnh là 1 word (32 bits) để lưu trữ.
1.1.2/ Nhắc lại về khai báo biến,kiểu dữ liệu. biến>: . VD:
string1: .asciiz “UIT” #tạo 1 chuỗi tên string1 với khởi tạo “UIT”.
var1: .word 5 #khai báo 1 số nguyên tên var1 chiếm 1 word lưu trữ, có giá trị khởi tạo là 5.
array1: .space 10 #tạo 1 mảng array1 có 10 bytes liên tục nhau, chưa khởi tạo giá trị.
array2: .byte ‘a’, ‘b’ #tạo 1 mảng array2 có 2 phần tử, mỗi phần tử chiếm 1 byte,
khởi tạo giá trị là ‘a’, ‘b’.
1.1.3/ Mảng vào con trỏ.
- Con trỏ thao tác trên địa chỉ của bộ nhớ.
- Mảng thao tác trên chỉ số mảng. Vd: a[0]… a[n]. 1.2/ Thực hành. 23 lOMoARcPSD| 27790909
Mảng array1 có 10 word, kích thước được lưu trong size1; Mảng array2 có 16
byte, kích thước được lưu trong size2; Mảng array3 có 8 byte, kích thước được
lưu trong size3. Viết code trong phần “.text” thực hiện riêng từng phần việc: ✓ In
ra cửa sổ I/O của MARS tất cả các phần tử của mảng array1 và array2. ✓
Gán các giá trị cho mảng array3 sao cho array3[i] = array2[i] + array2[size2 - 1 - i]. ✓
Người sử dụng nhập vào mảng thứ mấy và chỉ số phần tử cần lấy trong
mảng đó,chương trình xuất ra phần tử tương ứng.
B ng 3.8: Bài t p th c hànhậ ự STT MIPS Ý nghĩa Yêu cầu .data 1: In các
array1: .word 5, 6, 7, 8, 1, 2, 3, 9, phần tử 10 , 4 của array1 size1: .word 10 và array2
array2: .byte 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 13, 14, 15, 16 size2: .word 16 array3: .space 8 -Khai báo bi ến size3: .word 8
string1: .asciiz "Mang 1: " #76
string2: .asciiz "\nMang 2: " #85
str4: .asciiz "\nNhap mang thu may: " #95
str5: .asciiz "\nNhap phan tu thu may: " #116
str6: .asciiz "\nPhan tu do la: " #140 .text - Xuất "Mang 1: " 24 lOMoARcPSD| 27790909 #in array1 addi $v0,$zero,4 lui $1,0x00001001 ori $a0,$1,76 syscall
- Khởi tạo con trỏ bằng địa chỉ đầu tiên. lui $1,0x00001001 addi $t1,$1,0 addi $t2,$1,40 work1: lw $a0,0($t1)
- Chạy vòng lặp để xuất ra từng addi $v0,$0,1 phần tử trong array1 syscall addi $t1,$t1,4 slt $t3,$t1,$t2 bne $t3,$0,work1 #in array2 - Xuất "\nMang 2: " addi $v0,$zero,4 lui $1,0x00001001 ori $a0,$1,85 syscall
- Đưa địa chỉ đầu của array2 vào addi $t1,$t1, 4 $t1 -Đư a địa cuối của array 2 2 vào $t addi $t2,$t1, 16 -Đư
a địa chỉ đầu của array3 3 vô $t -Đư
a địa chỉ cuối của array3 vô addi $t3,$t2, 4 $t4
- Gán cố định địa chỉ array2 8 vô $t addi $t4,$t3, 8
- So sánh địa chỉ đầu cuối của addi $t8,$t2, 0
array3 nếu >= thì nhảy xuống work2:
work2.1. Ngược lại làm tiếp điều lb $a0,0($t1) kiện bên dưới. slt $t7,$t3,$t4 beq $t7,$0,work2.1
- Gán array3 sao cho array3[i] =
array2[i] + array2[size2 - 1 - i] addi $t2,$t2,-1 lb $t5,0($t2) add $t5,$t5,$a0 sb $t5,0($t3) addi $t3,$t3,1
- Chạy vòng lặp để xuất ra từng 25 lOMoARcPSD| 27790909 work2.1: addi $t1,$t1,1 addi $v0,$0,1 phần tử trong array2. syscall slt $t6,$t1,$t8 bne $t6,$0,work2 Yêu cầu #Nhap 2: nhập addi $v0,$zero,4 vào stt lui $1,0x1001 -Xuất " \nNhap mang thu may: " mảng và ori $a0,$1,95 số phân tử syscall rồi xuất ra
phần tử đó addi $v0,$0,5 syscall
- Gọi hệ thống cho nhập stt mảng addi $s1,$v0,0 rồi chuyển vào $s1 #nhap phan tu can lay addi $v0,$zero,4 lui $1,0x00001001
- Xuất "\nNhap phan tu thu may: " ori $a0,$1,116 syscall addi $v0,$0,5
- Gọi hệ thống cho nhập phần tử syscall rồi chuyển vào $s2 addi $s2,$v0,0 #xuat phan tu addi $v0,$zero,4 -Xuất " \nPhan tu do la: “ lui $1,0x00001001 ori $a0,$1,140 syscall addi $t0,$0,1
- So sánh stt mảng nếu =1 thì nhảy beq $s1,$t0,else1
else1, =2 thì nhảy else2,=3 thì addi $t0,$t0,1 nhảy else3 beq $s1,$t0,else2 addi $t0, $t0, 1 beq $s1,$t0, else3 else1: sll $t2,$s2,2 add $t9,$1,$t2
- Dò trong mảng 1 rồi xuất ra phần lw $a0,0($t9) tử 26 lOMoARcPSD| 27790909 j done else2: addi $t2,$s2,44 add $t9,$1,$t2
- Dò trong mảng 2 rồi xuất ra phần lb $a0,0($t9) tử j done else3: addi $t2,$s2,64
- Dò trong mảng 3 rồi xuất ra phần add $t9,$1,$t2 tử lb $a0,0($t9) done: addi $v0,$0,1 syscall 27 lOMoARcPSD| 27790909
H nh 3.7: Sơ đồ giải thuật 1.2 Lab3 1.3/ Bài tập. 1.3a/ 28 lOMoARcPSD| 27790909
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ổ.
B ng 3.9: Bài t p 1.3a Lab3 .data
string1: .asciiz "Nhap so luong Khai báo các chuỗi cần thiết. phan tu: "#24
string2: .asciiz "\nNhap phan tu thu "#19 string3: .asciiz ": " #3
string4: .asciiz "\nGia tri lon nhat: "#20
string5: .asciiz "\nGia tri nho nhat: "#20 string6: .asciiz "\nTong cac phan tu: "#20
string7: .asciiz "\nNhap phan tu thu: "#20
string8: .asciiz "\Phan tu do la: " array: .word .text Gán 0x00001001 vào $1. lui $1,0x00001001 Xuất string1 ra màn hình. addi $a0,$1,0 29 lOMoARcPSD| 27790909 addi $v0,$0,4
Lưu số vừa nhập từ bàn phím vào syscall $s1 (độ dài mảng). addi $v0, $0, 5 syscall addi Gán 0x00001001 vào $t8. $s1, $v0, 0 $t9 = $s1 * 4.
Cho $t9 là địa chỉ giới hạn của addi $t8, $1, 0 mảng. sll $t9, $s1, 2 add $t9, $t8, $t9
Xuất string2 ra màn hình (Nhập phần tử thứ). in: addi $a0,$1,24 addi $v0,$0,4#xuat string2 syscall
Đếm số thứ tự rồi xuất ra màn hình. addi $t1, $t1, 1# xuat stt addi $a0, $t1, 0 addi $v0, $0, 1 syscall
Xuất string3 ra màn hình ( : ) . addi $a0,$1,43 addi $v0,$0,4#xuat string3 syscall
Lưu số nhập từ bàn phím vào $v0. addi $v0, $0, 5 syscall sw
Gán giá trị của $v0 vào địa chỉ $v0, 0($t9)
$t8. $t8 += 4 (địa chỉ hiện tại dịch addi $t8, $t8,
lên 4 để sang địa chỉ kế tiếp). So 4 bne $t8, $t9,
sánh địa chỉ hiện tại với địa chỉ in
giới hạn. Nếu bằng thì tiếp tục
thực thi chương trình, ngược lại nhảy lên in. addi $t9, $0, 1 #max $t9 = 1. addi $t0, $1, 0
$t0 là địa chỉ đầu tiên. max1: lw $t1, 0($t0)
Gán giá trị ở địa chỉ $t0 vào $t1. 30 lOMoARcPSD| 27790909 max2: 31 lOMoARcPSD| 27790909 addi $t0, $t0, 4 beq
tại bằng địa chỉ giới hạn thì nhảy
tới xuatmax. Gán giá trị ở địa chỉ $t0, $t8, xuatmax lw
$t0 vào $t2 ($t1 là giá trị phần tử
n thì $t2 là giá trị phần tử n + 1). $t2, 0($t0)
So sánh giá trị phần tử n và giá trị phần tử n + 1.
Nếu $t1 (phần tử n) lớn hơn thì $t1 slt $t9, $t2, $t1
giữ nguyên, dịch $t2 sang địa chỉ kế tiếp. bne $t9, $0, max2 j max1
Nếu $t2 (phần tử n + 1) lớn hơn thì
$t1 sẽ giữ giá trị của $t2, $t2 sẽ
được dịch tới địa chỉ kế tiếp. Xuất string4 ra màn hình. xuatmax: addi $a0,$1,46 addi $v0,$0,4#xuat string4 syscall Xuất max ra màn hình. addi $a0, $t1, 0 addi $v0, $0, 1 syscall
$t0 là địa chỉ đầu tiên. addi $t0, $1, 0# MIN
Gán giá trị ở địa chỉ $t0 vào $t1. min1: lw $t1, 0($t0)
Địa chỉ hiện tại dịch 4 để sang địa min2: chỉ tiếp theo. addi $t0, $t0, 4
Nếu địa chỉ hiện tại bằng địa chỉ
giới hạn thì nhảy tới xuatmin. beq $t0, $t8, xuatmin
Gán giá trị ở địa chỉ $t0 vào $t2
Địa chỉ hiện tại dịch 4
để sang địa chỉ tiếp
theo. Nếu địa chỉ hiện 32 lOMoARcPSD| 27790909 lw $t2, 0($t0) 33 lOMoARcPSD| 27790909 slt $t9, $t1, $t2
$t2 là giá trị phần tử n + 1). bne $t9, $0, min2 j min1
So sánh giá trị phần tử n và giá trị
phần tử n + 1. Nếu $t1 (phần tử n)
nhỏ hơn thì $t1 giữ nguyên, dịch
$t2 sang địa chỉ kế tiếp. xuatmin: addi $a0,$1,66
Nếu $t2 (phần tử n + 1) nhỏ hơn addi $v0,$0,4#xuat
thì $t1 sẽ giữ giá trị của $t2, $t2 sẽ string5 syscall
được dịch tới địa chỉ kế tiếp. addi $a0, $t1, 0 addi $v0, $0, 1 Xuất string5 ra màn hình. syscall addi $t0, $1, 0# tong addi $t1, $0, 0 Xuất min ra màn hình. tong: lw $t2, 0($t0) add $t1, $t1, $t2 addi $t0, $t0, 4 bne $t0, $t8, tong
$t0 là địa chỉ đầu tiên. $t1 = 0.
Gán giá trị ở địa chỉ $t0 vào $t2. addi $a0,$1,86 addi $t1 += $t2. $v0,$0,4#xuat string6
Dịch lên 4 để sang địa chỉ kế tiếp. syscall
Nếu địa chỉ hiện tại bằng địa chỉ
giới hạn thì tiếp tục chương trình, addi $a0, $t1,
ngược lại nhảy lên tong. 0 addi $v0, $0, 1 syscall addi Xuất string6 ra màn hình. $a0,$1,106 ($t1 là giá trị phần tử n thì
Xuất tổng các phần tử ra màn hình. 34 lOMoARcPSD| 27790909 addi $v0,$0,4#xuat string7 Xuất string7 ra màn hình. syscall addi $v0, $0, 5 syscall
Lưu số nhập từ bàn phím vào $s1. addi $s1, $v0, 0 addi $a0,$1,126 addi $v0,$0,4#xuat string8 Xuất string8 ra màn hình. syscall sll $t0, $s1, 2 add $t1, $1, $t0 $t0 = $s1 * 4. lw $a0, 0($t1)
$t1 là địa chỉ cần tìm.
Gán giá trị ở địa chỉ $t1 vào $a0. addi $v0, $0, 1 syscall Xuất $a0 ra mà hình. 35 lOMoARcPSD| 27790909 36 lOMoARcPSD| 27790909
H nh 3.8: Sơ đồ giải thuật 1.3a Lab3 1.3b/
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ử). Mảng này gọi là A. Chuyển dòng lệnh C dưới đây sang mã assembly của
MIPS. Với các biến nguyên i, j được gán lần lượt vào thanh ghi $s0, $s1; và địa chỉ
nền của mảng số nguyên A được lưu trong thanh ghi $s3. if (i else A[i] = j; 37 lOMoARcPSD| 27790909
B ng 3.10: Bài t p 1.3b Lab3 .data
str1: .asciiz "Nhap so luong phan Khai báo các chuỗi cần thiết. tu: "#24
str2: .asciiz "\nNhap phan tu thu "#19 str3: .asciiz ": " #3 str4: .asciiz "\nNhap i: "#10 str5: .asciiz "\nNhap j: "#10 array: .word .text lui $1,0x00001001 Gán 0x00001001 vào $1. addi $s3, $1, 0
$s3 là địa chỉ đầu tiên. addi $a0,$1,0 Xuất str1 ra màn hình. addi $v0,$0,4#xuat str1 syscall addi $v0, $0, 5
Lưu số nhập từ bàn phím vào $s1 (độ syscall dài mảng). addi $s1, $v0, 0 addi $t9, $1, 0
$t9 là địa chỉ đầu tiên. sll $t8, $s1, 2 $t8 = $s1 * 4. add $t8, $t9, $t8
$t8 là địa chỉ giới hạn của array. 38 lOMoARcPSD| 27790909 IN: addi $a0,$1,24
Xuất str2 ra màn hình (Nhập phần tử addi $v0,$0,4#xuat str2 thứ). syscall addi $t1, $t1, 1# xuat stt
Đếm số thứ tự rồi xuất ra màn hình (số addi $a0, $t1, 0 thứ tự). addi $v0, $0, 1 syscall addi $a0,$1,43
Xuất str3 ra màn hình ( : ) . addi $v0,$0,4#xuat str3 syscall addi $v0, $0, 5
Lưu số nhập từ bàn phím vào $v0. syscall sw $v0, 0($t9)
Gán giá trị của $v0 vào địa chỉ $t9. addi $t9, $t9, 4
$t9 += 4 (địa chỉ hiện tại dịch lên 4 để bne $t9, $t8, IN
sang địa chỉ kế tiếp).
So sánh địa chỉ hiện tại với địa chỉ giới
hạn. Nếu bằng thì tiếp tục thực thi
chương trình, ngược lại nhảy lên IN. addi $a0,$1,46 Xuất str4 ra màn hình. addi $v0,$0,4#xuat str4 syscall addi $v0, $0, 5
Lưu số nhập từ bàn phím vào $s0 syscall ( nhập ). i addi $s0, $v0, 0 addi $a0,$1,56 Xuất str5 ra màn hình. addi $v0,$0,4#xuat str5 syscall addi $v0, $0, 5
Lưu số nhập từ bàn phím vào $s1 syscall ( nhập j ). addi $s1, $v0, 0 sll $t1, $s0, 2 $t1 = $s0 * 4. 39 lOMoARcPSD| 27790909 add $s3, $s3, $t1 $s3 là A[i]. slt $t0, $s0, $s1 So sánh i và j. beq $t0, $0, J
Nếu i nhỏ hơn j thì tiếp tục chương
trình, ngược lại nhảy xuống J. sw $s0, 0($s3)
Gán giá trị của $s0 vào địa chỉ $s3. j EXIT J: sw $s1, 0($s3)
Gán giá trị của $s1 vào địa chỉ $s3. EXIT:
H nh 3.9: Sơ đồ giải thuật 1.3b Lab3 40 lOMoARcPSD| 27790909
Chương 4. THỦ TỤC VÀ HÀM CON 1.1/ Lý thuyết.
1.1.1/ Thứ tự của một thủ tục và hàm con: + Lệnh A. + Gọi thủ tục Chuẩn bị đối số. Lưu trạng thái. Nhảy đến thủ tục.
+ Thực thi thủ tục Thực thi + Quay về chương trình chính Chuẩn bị kết quả.
Quay về (tại lệnh kế tiếp). + Lệnh C.
1.1.2/ Cách thực thi trong thủ tục và hàm con:
+ Dùng ngăn xếp để lưu trữ các đối số (dùng $sp), ngăn xếp lưu từ địa cao xuống địa chỉ thấp.
+ $pc : dùng để lưu địa chỉ tại lệnh đang thực thi.
+ Khôi phục các gia trị từ ngăn xếp vào lại thanh ghi.
+ Lệnh nhảy và lưu trạng thái của $pc : jal procedure ($ra = PC + 4).
+ Lệnh để quay về chương trình chính : jr $ra.
1.1.3/ Quy ước thanh ghi trong MIPS:
+ Thanh ghi đối số : $a0 - $a3.
+ Thanh ghi kết quả : $v0, $v1.
+ Thanh ghi tạm : $t0 - $t9.
+ Thanh ghi lưu trữ : $s0 - $s7.
+ Thanh ghi địa chỉ trả về : $ra.
+ Thanh ghi con trỏ ngăn xếp : $sp. 41 lOMoARcPSD| 27790909
1.2 / Thực hành với thủ tục. .data
prompt: .asciiz "Enter one number: " .text main: jal getInt move $s0,$v0 j exit getInt: li $v0,4 la $a0,prompt syscall li $v0,5 syscall jr $ra exit: move $a0,$s0 move $a1,$s1 move $a2,$s2 move $a3,$s3 jal proc_example move $a0,$v0 li $v0,1 syscall proc_example: addi $sp,$sp,-4
sw $s0,0($sp) #luu gia tri a vao sp add $t0,$a0,$a1 add $t1,$a2,$a3 sub $s0,$t0,$t1 move $v0,$s0 lw $s0,0($sp) addi $sp,$sp,4 jr $ra 42 lOMoARcPSD| 27790909
Yêu cầu 1: Viết lại code trong Hình 1, thêm vào thủ tục tên showInt để in ra cửa sổ
I/O giá trị của số int nhập vào cộng thêm 1.
B ng 4.11: Code trong Yêu cầồu 1 STT Code MIPS Hình 1 .data
prompt: .asciiz "Enter one number: " .text main: jal getInt move $s0,$v0 j exit getInt: li $v0,4 - Code mẫu la $a0,prompt syscall li $v0,5 syscall jr $ra exit: showInt: addi $v0,$v0,1 - Xuất ra số nguyên add $a0,$v0,$0 li $v0,1 syscall 43 lOMoARcPSD| 27790909
H nh 4.10: S đồồ gi i thu t Yêu cầồu 1ơ ả ậ
Yêu cầu 2: Viết lại code trong Hình 2, lúc này chương trình chính cần tính giá trị
của cả hai biểu thức: (a + b) – (c + d) và (a – b) + (c – d), hàm proc_example có hai
giá trị trả về và trong thân hàm sử dụng hai biến cục bộ $s0 và $s1 ($s1 lưu kết quả của (a – b) + (c – d)). 44 lOMoARcPSD| 27790909
B ng 4.12 : Code trong Yêu cầồu 2 .data string1: .asciiz "nhap a: " string2: .asciiz "nhap b: " string3: .asciiz "nhap c: " string4: .asciiz "nhap d: " .text #nhap a li $v0,4 la $a0,string1 syscall li $v0,5 syscall move $s0,$v0 #nhap b li $v0,4 Hình 2 la $a0,string2 Tính (a + b) – (c + d), syscall ( a - b) + (c – ) d li $v0,5 syscall move $s1,$v0 #nhap c li $v0,4 la $a0,string3 syscall li $v0,5 syscall move $s2,$v0 #nhap d li $v0,4 la $a0,string4 syscall 45 lOMoARcPSD| 27790909 li $v0,5 syscall move $s3,$v0 move $a0,$s0 move $a1,$s1 move $a2,$s2 move $a3,$s3 jal proc_example # (a + b) – (c - d) move $a0,$v0 li $v0,1 syscall #(a - b) + (c + d) move $a0,$v1 li $v0,1 syscall j exit proc_example: addi $sp,$sp,-4
sw $s0,0($sp) #luu gia tri a vao sp add $t0,$a0,$a1 add $t1,$a2,$a3 sub $s0,$t0,$t1 move $v0,$s0
lw $s0,0($sp) # trả giá trị a lại $s0 addi $sp,$sp,4 addi $sp,$sp,-8
sw $s0,0($sp) #luu gia tri b vao sp sub $t2,$a0,$a1 sub $t3,$a2,$a3 add $s1,$t2,$t3 move $v1,$s1
lw $s1,0($sp) #trả giá trị b lại $s1 addi $sp,$sp,8 jr $ra exit: 46 lOMoARcPSD| 27790909
H nh 4.11: S đồồ gi i thu t Yêu cầồu 2ơ ả ậ
Yêu cầu 3: Viết lại code trong Hình 2, lúc này chương trình chính cần tính giá trị
của cả hai biểu thức: (a + b) – (c + d), (e - f) hàm proc_example có 6 input và hai
giá trị trả về và trong thân hàm sử dụng hai biến cục bộ $s0 và $s1 ($s1 lưu kết quả của e - f).
B ng 4.13: Code trong Yêu cầồu 3 Tính (a + b) – (c + d), .data (e - f) string1: .asciiz "nhap a: " string2: .asciiz "nhap b: " string3: .asciiz "nhap c: " string4: .asciiz "nhap d: " string5: .asciiz "nhap e: " string6: .asciiz "nhap f: " .text #nhap a li $v0,4 la $a0,string1 47 lOMoARcPSD| 27790909 syscall li $v0,5 syscall move $s0,$v0 #nhap b li $v0,4 la $a0,string2 syscall li $v0,5 syscall move $s1,$v0 #nhap c li $v0,4 la $a0,string3 syscall li $v0,5 syscall move $s2,$v0 #nhap d li $v0,4 la $a0,string4 syscall li $v0,5 syscall move $s3,$v0 #nhap e li $v0,4 la $a0,string5 syscall li $v0,5 syscall move $s4,$v0 #nhap f li $v0,4 la $a0,string6 syscall li $v0,5 syscall 48 lOMoARcPSD| 27790909 move $s5,$v0 move $a0,$s4 move $a1,$s5 move $a2,$s2 move $a3,$s3 addi $sp,$sp,-4
sw $a0,0($sp) #luu gia tri cua e vao sp
move $a0,$s0 #dua a vao lai a0 addi $sp,$sp,-4
sw $a1,0($sp) #luu gia tri cua f vao sp move $a1,$s1 # dua b vao lai a1 jal proc_example #xuat (a+b)-(c+d) move $a0,$v0 li $v0,1 syscall #xuat (e-f) move $a0,$v1 li $v0,1 syscall j exit proc_example: addi $sp,$sp,-4
sw $s0,0($sp) #luu gia tri a vao sp add $t0,$a0,$a1 add $t1,$a2,$a3 sub $s0,$t0,$t1 move $v0,$s0
lw $s0,0($sp)#khoi phuc gia tri a 49 lOMoARcPSD| 27790909 addi $sp,$sp,4
lw $a1,0($sp) #dua gia tri f vao a1 addi $sp,$sp,4
lw $a0,0($sp) #dua gia tri e vao a0 addi $sp,$sp,-8
sw $s1,0($sp) #luu gia tri b vao sp sub $s1,$a0,$a1 move $v1,$s1 lw $s1,0($sp) #khoi phuc gia tri b addi $sp,$sp,8 jr $ra exit:
H nh 4.12: S đồồ gi i thu t Yêu cầồu 3ơ ả ậ 50 lOMoARcPSD| 27790909
1.3/ Thực hành với đệ quy.
Viết code MIPS, chạy kiểm thử trên MARS và giải thích ý nghĩa rõ ràng cho
chương trình tính giai thừa được viết bằng code C như Hình 3.
B ng 4.14: Code Th c hành v i đ quyự ớ ệ .data
str: .asciiz "The factorial of 10 is %d\n: " .text main: lui $1, 0x00001001 addi $a0, $1, 0 addi $v0, $0, 4 syscall addi $a0, $0, 10 jal fact addi $a0, $v0, 0 addi $v0, $0, 1 syscall j exit fact: addi $sp, $sp, -4 sw $ra, 0($sp) addi $t0, $a0, 0 fact1: 51 lOMoARcPSD| 27790909 addi $a0, $a0, -1 beq $a0, $0, return mul $t0, $t0, $a0 jal fact1 return: lw $ra, 0($sp) addi $v0, $t0, 0 jr $ra exit:
H nh 4.13: S đồồ gi i thu t 1.3 Lab4ơ ả ậ 1.4/ Bài tập. 1.4a/
Tiếp tục nội dung 2. Vẽ lại hình ảnh của các stack trong trường hợp tính 5! và 10!. 52 lOMoARcPSD| 27790909
H nh 4.14: Stack trong trườ ợng h p 5! 53 lOMoARcPSD| 27790909
H nh 4.15: Stack trong trườ ợng h p 10! 54 lOMoARcPSD| 27790909
TÀI LIỆU THAM KHẢO
1. KTMT---UIT, T ng quát vêồ h p ng và kiêắn trúc MIPS, TP.HCM, 2014. ổ ợ ữ
2. KTMT--- UIT, MARS - chương tr nh mồ ph ng assembly MIPS, TP.HCM, 2013.
3. KTMT--- UIT, M t sồắ l nh assembly MIPS c b n. ộ ệ ơ ả Cám ơn đã đọc! 55