Tải bản đầy đủ (.docx) (40 trang)

BÁO cáo môn học THỰC HÀNH KIẾN TRÚC máy TÍNH CE119 làm QUEN với lập TRÌNH hợp NGỮ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (307.5 KB, 40 trang )

ĐẠ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


×