ĐẠ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
GIẢNG VIÊN HƯỚNG DẪN: ________________________
SINH VIÊN THỰC HIỆN: __________________________________
TP. HỒ CHÍ MINH, THÁNG 12 NĂM 20xx
ĐẠ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
GIẢNG VIÊN HƯỚNG DẪN: ________________________
SINH VIÊN THỰC HIỆN: __________________________________________
TP. HỒ CHÍ MINH, THÁNG 12 NĂM 20xx
2
MỤC LỤC
3
DANH MỤC HÌNH ẢNH
Danh mục hình ảnh
4
DANH MỤC BẢNG
Bảng 1.
5
DANH MỤC TỪ VIẾT TẮT
ABC
:
nghĩa của ABC
6
CHƯƠNG 1. LÀM QUEN VỚI LẬP TRÌNH HỢP NGỮ
1.1 Lý thuyết
1.1.1. Cách cài đặt Ubuntu, Vim và Perl
Bước 1. Cài ứng dụng Ubuntu trên Windows 10
+
+
Start → Turn Windows features on or off → Windows Subsystem for Linux
Start → Store → Ubuntu → Get → Launch
Bước 2. Cài đặt Perl và Vim trên Ubuntu
+
+
+
Sudo apt-get install perl
Sudo apt-get install vim
Sudo apt-get install vimtutor
Bước 3. Vimtutor để học cách sử dụng Vim.
1.1.2. Cách sử dụng Vim
Bài 1.
-
Sử dụng 4 phím h, j, k, l để di chuyển con trỏ lần lượt qua trái, xuống, lên trên, qua phải.
Khi nhập không chắc chắn, nhấn phím ESC rồi tiến hành nhập lại.
Để thốt Vim, nhấn phím ESC, nhập :q! rồi nhấn phím ENTER.
Nhấn phím x để xố ký tự nằm dưới con trỏ.
Nhấn phím i để chèn thêm văn bản vào trước con trỏ.
Nhấn phím a để thêm văn bản.
Sử dụng :wq để lưu và thoát.
Bài 2.
-
Để xoá từ con trỏ đến từ tiếp theo, sử dụng :dw
Để xoá từ con trỏ đến cuối hàng, sử dụng :d$
Để xoá một hàng, sử dụng :dd
Để lặp lại một chuyển động, thêm vào trước nó một số :2w
Format để thay đổi câu lệnh: operator [number] motion
Trong đó:
+
+
+
-
operator: là lệnh cần thực hiện
number: là số lần lặp lại
motion: là di chuyển qua văn bản để thao tác (w – word, $ – đến cuối
hàng)
Để di chuyển về đầu hàng, sử dụng :0 (:zero)
Để hoàn tác hành động trước, sử dụng :u
Để hoàn tác những thay đổi trên một hàng, sử dụng :U
7
-
Để hồn tác những gì đã bỏ, sử dụng tổ hợp phím Ctrl+R
Bài 3.
-
Để trở về văn bản vừa bị xoá: p, đặt những văn bản bị xoá sau con trỏ.
Để thay thế ký tự tại chân con trỏ: r
Ấn ce để thay đổi từ con trỏ đến cuối một từ.
Ấn c$ để thay đổi đến cuối hàng.
Bài 4.
-
-
-
ctrl + G : hiển thị vị trí trong file và trạng thái của file
+ G: di chuyển đến cuối file
+ Number G: di chuyển đến hàng số đã điền
+ gg: di chuyển đến hàng đầu tiên
Nhấn / để tìm một cụm từ theo sau một cụm từ
+ Tìm một cụm từ một lần nữa, nhấn n
+ Tìm một cụm từ giống vậy ở hướng ngược lại, nhấn N
Tìm cụm từ theo hướng lùi, nhấn ? thay cho /
Để trở về từ nơi bạn nhấn: Ctrl + O (giữ Ctrl trong lúc nhấn o), lặp lại để trở về. Nhấn
Ctrl + I để tiến tới
Nhấn % trong lúc con trỏ đang ở (, [, { để tìm ra ), ], } phù hợp còn lại (dễ debug hơn)
Thay thế mới cho cái cũ nhất trong một hàng, nhấn :s/old/new
Thay mới mới cho tất cả cái cũ trên một hàng, nhấn :s/old/new/g
Thay thế những cụm từ giữa 2 hàng #, nhấn :#,#s/old/new/g
Thay thế tất cả lần xuất hiện trong một file, nhấn :%s/old/new/g
Để hỏi xác nhận sau mỗi lần thêm ‘c’, nhấn :%s/old/new/gc
Bài 5.
-
:!command thi hành một câu lệnh
:w FILENAME: viết file Vim hiện tại với tên FILENAME
v montion :w FILENAME: lưu những dòng được chọn trong file FILENAME
:r FILENAME: lấy lại đĩa FILENAME và đặt nó dưới vị trí con trỏ
:r !dir: đọc output của lệnh dir và đặt nó dưới vị trí con trỏ
Bài 6.
-
Gõ o để mở một hàng dưới con trỏ và bắt đầu chế độ Insert
Gõ O để mở một hàng trên con trỏ
Gõ a để chèn văn bản sau con trỏ
Gõ A để chèn văn bản sau hàng cuối cùng
Gõ e để di chuyển câu lệnh tới cuối từ
y để sao chép văn bản, p để dán
Nhấn R in hoa để thay thế chế độ Replace cho đến khi phím <ESC> được nhấn
Gõ “:set xxx” cài lựa chọn cho “xxx”
Bỏ trước “no” để một lựa chọn tắt: :set noic
8
Bài 7.
-
Gõ :help hoặc nhấn F1 để mở cửa sổ trợ giúp
Gõ :help cmd để tìm trợ giúp trên cmd
Gõ ctrl + W ctrl + W để nhảy đến một cửa sổ khác
Gõ :q để đóng cửa sổ trợ giúp
Gõ : command, nhấn ctrl + D để nhìn những hồn thành khả dụng, nhấn phím <Tab> để
sử dụng một hồn thành
1.1.3. Lí thuyết chương trình hợp ngữ
1.1.3.1. Bộ nhớ
- Lưu dữ liệu theo byte, half, word.
- Một ký tự được lưu trong 1 byte.
- Một số nguyên được lưu trong 1 word.
- Một lệnh được lưu trong 1 word.
1.1.3.2. Biểu diễn thơng tin
- Kí số:
+ Hệ thập phân: Viết bình thường (17)
+ Hệ thập lục phân: Thêm tiền tố 0x (0x11)
- Ký tự: Đặt trong cặp nháy đơn (‘d’)
- Chuỗi: Đặt trong cặp nháy kép (“Integrated circuit”) hoặc (“d”)
1.1.3.3. Thanh ghi
- Có 32 thanh ghi đa dụng (từ 0->31).
- Biểu diễn: Tiền tố $ theo sau là chỉ số hoặc tên ($2 hay $sp).
- Thanh ghi Hi và Lo được dành riêng cho phép nhân và phép chia (mfhi , mflo).
- Qui ước:
+ $at dành cho Trình biên dịch hợp ngữ, $k0 và $k1 dành cho OS.
+ $gp, $sp, $fp, $ra dành cho các lệnh chuyên biệt, không nên sử dụng để lưu trữ
tạm trong q trình tính tốn.
1.1.3.4. Cấu trúc chương trình
# Chú thích bằng ký tự #
.data
# Khai báo dữ liệu ngay sau hàng này
# Khai báo dữ liệu
.text
main:
# Viết chương trình ngay sau hang này
# Nhãn thể hiện bắt đầu chương trình
# Viết chương trình
1.1.3.5. Khai báo dữ liệu
[<nhãn>:]
.<kiểu dữ liệu>
<danh sách giá trị>
9
-
Ví dụ:
+
+
+
+
var1: .word 3
# biến ngun var1 có kích thước 1 word và giá trị là 3
arr1: .byte ‘a’,’k’ # mảng arr1 có 2 phần tử, mỗi phần tử 1 byte
arr2: .space 40
# mảng arr2 có kích thước 40 byte liên tục
str1: .ascciz “ahihi” # chuỗi str1 có kết thúc bởi null
1.2. Thực hành
1.2.1. Mô phỏng việc thực thi các lệnh
Bảng 1.1 – Chức năng của một số lệnh trong MIPS
STT LỆNH
VÍ DỤ
CHỨC NĂNG
1
add
add $t1, $t2, $t3
Gán $t1 là tổng của giá trị tại $t2 và $t3
2
addi
addi $t1, $t2, -100
Gán $t1 là tổng của giá trị tại $t2 và giá trị bất kỳ
3
addu
addu $t1, $t2, $t3
Tương tự lệnh add, kết quả trả về là số không dấu
4
addiu addiu $t1, $t2, -100
Tương tự lệnh addi, kết quả trả về là số không dấu
5
sub
sub $t1, $t2, $t3
Gán $t1 là kết quả phép trừ giữa giá trị tại $t2 và $t3
6
subu
subu $t1, $t2, $t3
Tương tự lệnh sub, kết quả trả về là số không dấu
7
and
and $t1, $t2, $t3
Gán $t1 là “and” của các giá trị luận lý tại $t2 và $t3
8
andi
andi $t1, $t2, 100 Gán $t1 là “and” của giá trị luận lý tại $t2 & giá trị bất kỳ
9
or
or $t1, $t2, $t3
Gán $t1 là “or” của các giá trị luận lý tại $t2 và $t3
10
nor
nor $t1, $t2, $t3
Gán $t1 là “nor” của các giá trị luận lý tại $t2 và $t3
11
lw
lw $t1, label
Đưa giá trị của label vào thanh ghi $t1 ở kiểu word
12
sw
sw $t1, label
Lưu giá trị kiểu word tại thanh ghi $t1 vào địa chỉ label
13
slt
slt $t1, $t2, $t3
Nếu $t2 < $t3 thì $t1 = 1, nếu khơng thì $t1 = 0
14
slti
slti $t1, $t2, -100
Nếu $t2 < -100 thì $t1 = 1, nếu khơng thì $t1 = 0
15
sltu
sltu $t1, $t2, $t3
Tương tự lệnh slt nhưng dùng quy tắc so sánh không dấu
16
sltiu
sltiu $t1, $t2, -100 Tương tự lệnh slti nhưng dùng quy tắc so sánh không dấu
syscal
17
Gọi chức năng nhập xuất tuỳ thuộc theo giá trị của $v0
l
1.2.2. Ý nghĩa của chương trình
Bảng 1.2 – Ý nghĩa của các chương trình mẫu
STT
Chương trình
Ý nghĩa
.data
var1: .word 23
1
2
.text
__start:
lw
li
sw
.data
array1:
.text
__start:
var1 = 23
$t0, var1
$t1, 5
$t1, var1
$t0 = *var1
$t1 = 5
var1 = $t1
.space 12
array1[12], array1=&array1[0]
la
$t0 = array1 = &array1[0]
$t0, array1
10
3
li
$t1, 5
sw
$t1, ($t0)
li
$t1, 13
sw
$t1, 4($t0)
li
$t1, –7
sw
$t1, 8($t0)
$v0, 5
syscall
li
.data
string1:
4
$t1 = 5
array1[0] = 0($t0) = $t1 = 5
$t1 = 13
array1[1] = 4($t0) = $t1 = 13
$t1 = –7
array1[2] = 8($t0) = $t1 = –7
$v0 = 5
Gọi syscall với chức năng đọc số nguyên
string1 = “Print this.\n\0”
.asciiz “Print this.\n”
.text
main: li
$v0, 4
la
$a0, string1
syscall
$v0 = 4
$a0 = &string1
Gọi syscall với chức năng xuất chuỗi,
với $a0 chứa địa chỉ của chuỗi kết thúc
bằng null
1.3 Bài tập
1.3.1. Khai báo chuỗi và xuất các chuỗi được khai báo
a. Đề bài:
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 ^-^
b. Sơ đồ giải thuật:
11
Bắt đầu
$v0 = 4
$a0 = &chuoi1
Syscall
(Xuất chuỗi thứ
nhất)
$v0 = 4
$a0 = &chuoi2
Syscall
(Xuất chuỗi thứ
hai)
Kết thúc
Hình 1.1 – Sơ đồ giải thuật xuất chuỗi được khai báo
c. Chương trình:
.data
chuoi1: .asciiz
chuoi2: .asciiz
.text
main:
lui
$1,
ori
$4,
addiu $2,
syscall
lui
$1,
ori
$4,
addiu $2,
syscall
"Chao ban! Ban la sinh vien nam thu may?\n"
"Hihi, minh la sinh vien nam thu 1 ^-^\n"
0x00001001
$1, 0x00000000
$0, 0x00000004
0x00001001
$1, 0x00000029
$0, 00000004
12
1.3.2. Biểu diễn chuỗi trên dưới bộ nhớ
Các chuỗi trên được mã hóa vào trong thanh ghi dưới dạng mã thập lục phân.
Hình 1.2 – Biểu diễn chuỗi dưới bộ nhớ
1.3.3. Xuất ra đúng chuỗi đã nhập
a. Đề bài:
Nhập chuỗi và xuất ra đúng chuỗi đã nhập. Ví dụ:
-
Nhập: Truong Dai hoc Cong nghe thong tin
Xuất: Truong Dai hoc Cong nghe thong tin
b. Sơ đồ giải thuật:
Bắt đầu
$a0 = &chuoi
$a1 = 100
$v0 = 8, Syscall
(Nhập chuỗi)
$v0 = 4, Syscall
(Xuất chuỗi)
Kết thúc
Hình 1.3 – Sơ đồ giải thuật xuất đúng chuỗi đã nhập
13
c. Chương trình:
.data
chuoi:
.asciiz "\0"
.text
main:
lui
$1, 0x00001001
ori
$4, $1, 0x00000000
addiu $5, $0, 0x00000064
addiu $2, $0, 0x00000008
syscall
addiu $2, $0, 0x00000004
syscall
1.3.4. Tính tổng hai số nguyên được nhập từ bàn phím
a. Đề bài:
Nhập vào 2 số nguyên, sau đó xuất tổng của 2 số nguyên này.
b. Sơ đồ giải thuật:
Bắt đầu
$v0 = 5, Syscall
(Nhập số nguyên)
(Lưu giá trị số nguyên thứ nhất)
$a1 = $v0 + $0
$v0 = 5, Syscall
(Nhập số nguyên)
$a2 = $v0 + $0
(Lưu giá trị số nguyên thứ hai)
$a0 = $a1 + $a2
(Tính tổng)
$v0 = 1, Syscall
(Xuất số nguyên $a0)
Kết thúc
14
Hình 1.4 – Sơ đồ giải thuật tính tổng hai số ngun nhập từ bàn phím
c. Chương trình:
.text
main:
addiu $2,
syscall
add
$5,
addiu $2,
syscall
add
$6,
add
$4,
addiu $2,
syscall
$0, 0x00000005
$2, $0
$0, 0x00000005
$2, $0
$5, $6
$0, 0x00000001
15
CHƯƠNG 2. CÁC CẤU TRÚC ĐIỀU KHIỂN
2.1. Lí thuyết
2.1.1. Cấu trúc if, if-else
-
-
Đầu tiên thực hiện việc so sánh điều kiện
+ So sánh bằng
(a == b)
+ So sánh không bằng
(a != b)
+ So sánh bé hơn, bé hơn hoặc bằng
(a < b, a <= b)
+ So sánh lớn hơn, lớn hơn hoặc bằng
(a > b, a >= b)
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ì khơng
thực thi đoạn mã.
2.1.2. Cấu trúc switch/case
-
Kiểm tra từng điều kiện để đưa vào trường hợp đúng tương ứng.
Có thể chuyển thành cấu trúc if, if-else.
2.1.3. Cấu trúc vòng lặp
-
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ì thốt.
2.2. Thực hành
2.2.1. Cấu trúc rẽ nhánh
Chuyển đoạn code trong bảng theo sau sang MIPS.
if (i==j)
f = g + h;
else
f = g – h;
(Với giá trị của i, j, f, g, h lần lượt chứa trong các thanh ghi $s0, $s1, $s2, $t0, $t1)
Trả lời:
.text
main:
beq $16, $17, cong
sub $18, $8, $9
j exit
cong:
add $18, $8,
$9
exit:
16
2.2.2. Cấu trúc vòng lặp
Chuyển đoạn code trong bảng theo sau sang MIPS.
int Sum = 0;
for (int i = 1; i <= N; ++i) {
Sum = Sum + 1;
}
(Với giá trị của i, N, Sum lần lượt chứa trong các thanh ghi $s0, $s1, $s2)
Trả lời:
.text
main:
add
addiu
$18, $0, $0
$16, $0, 0x00000001
slt
bne
add
addi
j loop
$8,
$8,
$18,
$16,
loop:
$17,
$0,
$18,
$16,
$16
exit
$16
0x00000001
exit:
2.3. Bài tập
2.3.1. Phân biệt ký tự nhập vào và xuất ký tự liền trước, liền sau.
a. Đề bài:
Nhập một ký tự từ bàn phím và thực hiện theo yêu cầu.
Ký tự nhập vào chỉ được phép là ba loại: số, chữ thường và chữ hoa. Nếu ký tự
nhập vào rơi vào một trong ba loại, xuất ra cửa sổ đó là loại nào; nếu ký tự
nhập khơng rơi vào một trong ba loại trên, xuất ra thông báo “invalid type”.
Xuất ra cửa sổ ký tự liền trước và liền sau của ký tự nhập vào.
Ví dụ:
Nhap ky tu: b
Chu thuong
Ky tu truoc: a
Ky tu sau: c
17
b. Sơ đồ giải thuật:
Bắt đầu
$v0 = 12, Syscall
(Nhập kí tự)
$s0 = $v0
$s0>47
(Lưu kí tự vào $s0)
Đ
&&
$v0 = 4, Syscall
Xuất “Chu so”
$s0<58
S
$s0>64 &&
Đ
$s0<91
$v0 = 4, Syscall
Xuất “Chu hoa”
S
$s0>96 &&
$s0<123
Đ
$v0 = 4, Syscall
Xuất “Chu hoa”
$t1 = $s0 – 1
S
$v0 = 11, Syscall
$v0 = 4, Syscall
Xuất kí tự trước $t1
Xuất “invalid Type”
$v0 = 11, Syscall
Xuất kí tự sau $t2
$t2 = $s0 + 1
Kết thúc
Hình 2.1 – Sơ đồ giải thuật phân loại ký tự và tìm ký tự trước sau
18
c. Chương trình
.data
so:
hoa:
thg:
khac:
.asciiz
.asciiz
.asciiz
.asciiz
"Chu so"
"Chu hoa"
"Chu thuong"
"Invalid type"
.text
main:
addiu $2, $0, 0x0000000c
syscall
addi $16, $2, 0x00000000
addi $1, $0, 0x0000002f
slt $8, $1, $16
slti $9, $16, 0x0000003a
and $10, $9, $8
bne $10, $0, c_so
addi $1, $0, 0x00000040
slt $8, $1, $16
slti $9, $16, 0x0000005b
and $10, $9,$8
bne $10, $0, c_hoa
addi $1, $0, 0x00000060
slt $8, $1, $16
slti $9, $16, 0x0000007b
and $10, $9,$8
bne $10, $0, c_thg
j c_khac
c_so:
lui $1, 0x00001001
ori $4, $1, 0x00000000
addiu
$2, $0, 0x00000004
syscall
j xuat
19
c_hoa:
lui $1,
ori $4,
addiu
syscall
j xuat
c_thg:
lui $1,
ori $4,
addiu
syscall
j xuat
c_khac:
lui $1,
ori $4,
addiu
syscall
j xuat
0x00001001
$1, 0x00000005
$2, $0, 0x00000004
0x00001001
$1, 0x0000000f
$2, $0, 0x00000004
0x00001001
$1, 0x0000001c
$2, $0, 0x00000004
xuat:
addi
$9,
addi
$4,
addiu
$2,
syscall
addi $10,$16,
addi $4, $10,
addiu
$2,
syscall
$16,
$9,
$0,
0xffffffff
0x00000000
0x0000000b
0x00000001
0x00000000
$0,
0x0000000b
20
2.3.2. Tìm số lớn hơn và tính tốn theo u cầu
a. Đề bài:
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, thương của hai số.
b. Sơ đồ giải thuật:
21
(nhap[0] là số lớn hơn)
22
Hình 2.2 – Sơ đồ thuật tốn tìm số lớn hơn và tính tốn
c. Chương trình:
.data
nhap:.space
2
.text
main:
# Nhap so1
addiu
syscall
$2, $0, 0x00000005
lui
ori
$1, 0x00001001
$16, $1, 0x00000000
sb
sb
$2,
$2,
# Nhap so2
addiu
syscall
0x00000000($16)
0x00000004($16)
$2, $0, 0x00000005
# So sanh
lb
$3, 0x00000000($16)
slt $8, $3, $2
bne $8, $0, so2lon
# So1 lon
sb
$2, 0x00000004($16)
j tinhtoan
so2lon:
sb
$2, 0x00000000($16)
tinhtoan:
lb
lb
$8, 0x00000000($16) #L
$9, 0x00000004($16) #B
xuat:
lb
addiu
syscall
$4,0x00000000($16)
$2, $0,0x00000001
23
24
Chương
tong:
add
addiu
syscall
$4, $8, $9
$2, $0,0x00000001
hieu:
sub
addiu
syscall
$4, $8, $9
$2, $0,0x00000001
tich:
mul
addiu
syscall
$4, $8, $9
$2, $0,0x00000001
bne
break
div
mflo
addiu
syscall
$9, $0, thuong
thuong:
$8, $9
$4
$2, $0,0x00000001
3. CON TRỎ VÀ TRUY XUẤT BỘ NHỚ
3.1. Lí thuyết
3.1.1. Kiến trúc thanh ghi – thanh ghi
-
Ví dụ:
int a = 7;
int b = 5;
int c;
c = a + b;
-
Ý tưởng: đưa giá trị từng biến a, b, c ở các ô nhớ vào từng thanh ghi trong tập thanh ghi
(của CPU), tiến hành tính tốn và đưa vào thanh ghi, sau đó đưa kết quả vào các ô nhớ.
Chương trình:
25