Professional Documents
Culture Documents
Báo Cáo Ce119
Báo Cáo Ce119
HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA KỸ THUẬT MÁY TÍNH
ii
MỤC LỤC
ii
DANH MỤC HÌNH ẢNH
iii
DANH MỤC BẢNG
Bảng 1.
iv
DANH MỤC TỪ VIẾT TẮT
v
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
- 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.
- Để thoát Vim, nhấn phím ESC, nhập :q! rồi nhấn phím ENTER.
- Nhấn phím x để xoá 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.
Trong đó:
+ operator: là lệnh cần thực hiện
+ number: là số lần lặp lại
6
+ 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
- Để hoà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.
Bài 6.
Bài 7.
.text
1 __start: $t0 = *var1
lw $t0, var1 $t1 = 5
li $t1, 5 var1 = $t1
sw $t1, var1
.data
array1: .space 12 array1[12], array1=&array1[0]
.text
__start: la $t0, array1 $t0 = array1 = &array1[0]
li $t1, 5 $t1 = 5
2 array1[0] = 0($t0) = $t1 = 5
sw $t1, ($t0)
li $t1, 13 $t1 = 13
sw $t1, 4($t0) array1[1] = 4($t0) = $t1 = 13
li $t1, –7 $t1 = –7
sw $t1, 8($t0) array1[2] = 8($t0) = $t1 = –7
li $v0, 5 $v0 = 5
3
syscall Gọi syscall với chức năng đọc số nguyên
4 .text $v0 = 4
main: li $v0, 4 $a0 = &string1
la $a0, string1 Gọi syscall với chức năng xuất chuỗi,
syscall 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:
10
- 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:
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
c. Chương trình:
.data
chuoi1: .asciiz "Chao ban! Ban la sinh vien nam thu may?\n"
chuoi2: .asciiz "Hihi, minh la sinh vien nam thu 1 ^-^\n"
.text
main:
lui $1, 0x00001001
ori $4, $1, 0x00000000
addiu $2, $0, 0x00000004
syscall
lui $1, 0x00001001
ori $4, $1, 0x00000029
addiu $2, $0, 00000004
syscall
11
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.
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
12
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
b. Sơ đồ giải thuật:
Bắt đầu
$v0 = 5, Syscall
(Nhập số nguyên)
$v0 = 5, Syscall
(Nhập số nguyên)
$v0 = 1, Syscall
(Xuất số nguyên $a0)
Kết thúc
Hình 1.4 – Sơ đồ giải thuật tính tổng hai số nguyên nhập từ bàn phím
13
c. Chương trình:
.text
main:
addiu $2, $0, 0x00000005
syscall
add $5, $2, $0
addiu $2, $0, 0x00000005
syscall
add $6, $2, $0
add $4, $5, $6
addiu $2, $0, 0x00000001
syscall
14
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ã.
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:
15
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 $18, $0, $0
addiu $16, $0, 0x00000001
loop:
slt $8, $17, $16
bne $8, $0, exit
add $18, $18, $16
addi $16, $16, 0x00000001
j loop
exit:
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
b. Sơ đồ giải thuật:
16
Bắt đầu
S
$v0 = 11, Syscall
$v0 = 4, Syscall Xuất kí tự trước $t1
Xuất “invalid Type”
Kết thúc
c. Chương trình
17
.data
so: .asciiz "Chu so"
hoa: .asciiz "Chu hoa"
thg: .asciiz "Chu thuong"
khac: .asciiz "Invalid type"
.text
main:
addiu $2, $0, 0x0000000c
syscall
addi $16, $2, 0x00000000
j c_khac
c_so:
lui $1, 0x00001001
ori $4, $1, 0x00000000
addiu $2, $0, 0x00000004
syscall
j xuat
18
c_hoa:
lui $1, 0x00001001
ori $4, $1, 0x00000005
addiu $2, $0, 0x00000004
syscall
j xuat
c_thg:
lui $1, 0x00001001
ori $4, $1, 0x0000000f
addiu $2, $0, 0x00000004
syscall
j xuat
c_khac:
lui $1, 0x00001001
ori $4, $1, 0x0000001c
addiu $2, $0, 0x00000004
syscall
j xuat
xuat:
addi $9, $16, 0xffffffff
addi $4, $9, 0x00000000
addiu $2, $0, 0x0000000b
syscall
addi $10,$16, 0x00000001
addi $4, $10, 0x00000000
addiu $2, $0, 0x0000000b
syscall
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:
19
Bắt đầu
$v0 = 5, Syscall
Nhập số thứ nhất
$v0 = 5, Syscall
Nhập số thứ hai
Đ S
nhap[0] = $v0 nhap[0] < $v0 nhap[1] = $v0
$v0 = 1, Syscall
Xuất nhap[0]
(nhap[0] là số lớn hơn)
$t0 = nhap[0]
$t1 = nhap[1]
$a0 = $t0 + $t1 $a0 = $t0 – $t1 $a0 = $t0 × $t1 $a0 = $t0 ÷ $t1
$v0 = 1, Syscall
Xuất số nguyên
Kết thúc
c. Chương trình:
20
.data
nhap:.space 2
.text
main:
# Nhap so1
addiu $2, $0, 0x00000005
syscall
sb $2, 0x00000000($16)
sb $2, 0x00000004($16)
# Nhap so2
addiu $2, $0, 0x00000005
syscall
# 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 $8, 0x00000000($16) #L
lb $9, 0x00000004($16) #B
xuat:
lb $4,0x00000000($16)
addiu $2, $0,0x00000001
syscall
21
tong: add $4, $8, $9
addiu $2, $0,0x00000001
syscall
22
Chương 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 toán và đưa vào thanh ghi, sau đó đưa kết quả vào các ô nhớ.
- Chương trình:
.data
addrA: .word 7
addrB: .word 5
addrC: .word
.text
main:
lui $1, 0x00001001
lw $8, 0x00000000($1)
23
- Ví dụ:
clear1(int array[], int size) {
int i;
for (i = 0; i < size; i++)
array[i] = 0;
}
- Ý tưởng: $a0 là địa chỉ của array, $a1 là kích thước của array (size), lần lượt tìm địa chỉ
của các phần tử mảng kế tiếp (bằng cách cộng lần lượt 0, 4, 8, 12, ... vào địa chỉ mảng
$a0) và lưu giá trị 0 tại đó, lặp lại đến khi biến i ($t0) không nhỏ hơn kích thước mảng
($a1)
- Chương trình:
.text
add $8, $0, $0
loop:
sll $9, $8, 0x00000002
add $10, $4, $9
sw $0, 0x00000000($10)
addi $8, $8, 0x00000001
slt $11, $8, $5
bne $11, $0, loop
- Ý tưởng: $a0 là địa chỉ của array, $a1 là kích thước của array (size), con trỏ $t0 là địa chỉ
phần tử đầu tiên, $t2 là địa chỉ của phần tử cuối cùng (qua tính toán), sau đó lặp lại việc
thay đổi giá trị tại con trỏ ($t0=0) và dời con trỏ sang địa chỉ của phần tử kế tiếp ($t0+=4)
cho đến khi con trỏ $t0 không nhỏ hơn $t2 (địa chỉ phần tử cuối).
24
- Chương trình:
.text
add $8, $0, $4
sll $9, $5, 0x00000002
add $10,$4,$9
loop:
sw $0, 0x00000000($8)
addi $8, $8, 0x00000004
slt $11, $8, $10
bne $11, $0, loop
.data
array1: .word 5, 6, 7, 8, 1, 2, 3, 9, 10, 4
size1: .word 10
array3: .space 8
size3: .word 8
Mảng array1 có 10 words, kích thước được lưu trong size1; Mảng array2 có 16 bytes, kích
thước được lưu trong size2; Mảng array3 có 8 bytes, kích thước được lưu trong size3.
Viết code 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.
25
Trả lời:
Yêu cầu 1: xuất các phần tử của mảng array1 và array2 ra cửa sổ I/O:
- Ý tưởng: truy xuất phần tử của mảng theo chỉ số mảng, tức nghĩa là dựa vào chỉ số
mảng để tính toán địa chỉ của phần tử đang xét (mảng array1 với mỗi phần tử kiểu
word có độ lớn 4 bytes, mảng array2 với mỗi phần tử có độ lớn 1 byte), lặp lại các
công đoạn tính toán đến khi chỉ số mảng không nhỏ hơn kích thước mảng.
- Ta có sơ đồ thuật toán như sau:
Bắt đầu
$t0 = 0 $t0 = 0
$t1 = size1 $t2 = size2
$a1 = &array1 $a2 = &array2
Đ S Đ S
$t0 < $t1 $t0 < $t2
Kết thúc
Hình 3.1 – Sơ đồ thuật toán xuất các phần tử của mảng array1 và array2
Yêu cầu 2: thực hiện gán các giá trị lần lượt cho từng phần tử của mảng array3 theo biểu
thức array3[i] = array2[i] + array2[size2 – 1 – i]
- Ý tưởng: truy xuất phần tử của mảng theo chỉ số mảng (tương tự như yêu cầu 1),
tuy nhiên việc tính toán địa chỉ của phần tử array2[size2 – 1 – i] có hơi khác so với
26
phần tử array2[i] ở chỗ ta phải tính ra địa chỉ của phần tử cuối cùng của mảng
array2 trước.
- Ta có sơ đồ thuật toán như sau:
Bắt đầu
$t0 = 0
$t3 = size3
$a3 = &array3
$t2 = size2 – 1
$a2 = &array2
$s1 = &array3[$t0]
$s2 = &array2[$t0]
$s3 = &array2[size2 – 1 – $t0]
$t4 = *($s2)
$t5 = *($s3)
$t6 = $t5 + $t4
*($s1) = $t6
$t0 = $t0 + 1
Kết thúc
Hình 3.2 – Sơ đồ thuật toán thực hiện gán các giá trị cho các phần tử mảng array3
27
- Ý tưởng: nếu số nguyên đầu tiên nhập vào là 1 thì truy xuất mảng array1, nếu là 2
thì truy xuất mảng array2; thực hiện việc truy xuất phần tử có chỉ số là số nguyên
nhập vào thứ hai tương tự như cách tính ở 2 yêu cầu trên.
Bắt đầu
$v0 = 5, Syscall
Nhập số nguyên
$s0 là 1 (array1)
$s0 = $v0
hoặc 2 (array2)
$v0 = 5, Syscall
Nhập số nguyên
$s0 == 1
$v0 = 1, Syscall
Xuất số nguyên
Kết thúc
Bắt đầu
Đ S Đ S
$t0 < $t1 $t0 < $t2 Đ $t0 < $t2
$s0 == 1
$s0 = $v0 $s1 = $v0
$v0 = 1, Syscall
Xuất số nguyên
Kết thúc
29
Hình 3.4 – Sơ đồ giải thuật bài toán thao tác với con trỏ
- Chương trình:
3.3. Bài tập
3.3.1. Bài tập 1
a. Đề bài:
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:
b. Sơ đồ giải thuật:
c. Chương trình:
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:
b. Sơ đồ giải thuật:
c. Chương trình:
30
CHƯƠNG 4. THỦ TỤC (HÀM CON)
4.1. Lí thuyết
4.1.1. Thủ tục
- Quy trình thực hiện:
Hình 4.1 – Quy trình thực hiện lời gọi thủ tục
31
4.1.3. VÍ DỤ
void main ( ) {
int s = 0;
s = sum(15,12);
}
int sum(int a, int b) {
int t = a + b;
return t;
}
jal sumPro
j exit
sumPro:
jr $ra
exit:
32
4.2. Thực hành
4.2.1. IN RA CỬA SỔ I/O GIÁ TRỊ CỦA SỐ INT NHẬP VÀO CỘNG THÊM 1
abc
4.2.2. TÍNH GIÁ TRỊ BIỂU THỨC (A+B) – (C+D) VÀ (A-B) + (C-D)
abc
33
TÀI LIỆU THAM KHẢO
[1] Làm quen cách sử dụng Vim với Vimtutor, http://notes.viphat.work/vimtutor
34