




























































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 HỢP 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 H 椃 nh 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 H 椃 nh 2.1: Sơ đồ giải thuật 1.2.1
Lab2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 H 椃 nh 2.2: Sơ đồ giải thuật 1.2.2
Lab2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15 H 椃 nh 2.3: Sơ đồ giải thuật 1.3a
Lab2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 H 椃 nh 2.4: Sơ đồ giải thuật 1.3b
Lab2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 H 椃 nh 3.1: Sơ đồ giải thuật 1.2
Lab3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 H 椃 nh 3.2: Sơ đồ giải thuật 1.3a
Lab3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 H 椃 nh 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 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 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 Labậ3 .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 Labậ3 .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