









Preview text:
lOMoAR cPSD| 59285474 1
CE119-Lab01/IT012-Lab03 1. Lý thuyết
Giảng viên hướng dẫn sinh viên sử dụng phần mềm MARS dựa theo tài liệu:
MARS – chương trình mô phỏng hợp ngữ (assembly) MIPS 2. Thực hành
2.1 Sinh viên tìm hiểu tài liệu “Một số lệnh assembly MIPS cơ bản” và 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 Lệnh Syntax Ý nghĩa add add rd, rs, rt R[rd] = R[rs] + R[rt]
Thực hiện cộng giá trị thanh ghi rs với thanh rt, tổng đưa
vào thanh ghi rd, có xét kết quả có bị overflow hay
không (thông báo nếu có overflow) addi addi rt, rs imm R[rt] = R[rs] + SignExtImm
Thực hiện cộng giá trị thanh ghi rs với số tức thời, kết
quả đưa vào thanh ghi rt, có xét kết quả có bị overflow hay không addu addu rd, rs, rt R[rd] = R[rs] + R[rt]
Thực hiện cộng giá trị thanh ghi rs với thanh rt, tổng đưa
vào thanh ghi rd, không xét kết quả có bị overflow hay
không (thông báo nếu có overflow) addiu addiu rt, rs, imm R[rt] = R[rs] + SignExtImm
Thực hiện cộng giá trị thanh ghi rs với số tức thời, kết
quả đưa vào thanh ghi rt, không xét kết quả có bị overflow hay không sub sub rd, rs, rt R[rd] = R[rs] – R[rt]
Thực hiện trừ giá trị thanh ghi rs với thanh rt, kết quả
đưa vào thanh ghi rd, có xét kết quả có bị overflow hay không subu subu rd, rs, rt R[rd] = R[rs] – R[rt]
Thực hiện trừ giá trị thanh ghi rs với thanh rt, kết quả
đưa vào thanh ghi rd, không xét kết quả có bị overflow hay không and and rd, rs, rt R[rd] = R[rs] & R[rt]
Thực hiện and từng bit giá trị của thanh ghi rs và rt với
nhau, kết quả lưu vào thanh ghi rd andi and rt, rs, imm
R[rt] = R[rs] & ZeroExtImm
Trần Đại Dương – Khoa Kỹ thuật Máy tính, Trường Đại học Công nghệ Thông tin Youtube.com/DuongComputing
Facebook.com/groups/EmAnhDuong lOMoAR cPSD| 59285474 2
Thực hiện and từng bit giá trị của thanh ghi rs với một số
tức thời ( số tức thời đang là số 16 bits, mở rộng thành số
32 bits theo kiểu ZeroExtImm), kết quả lưu vào thanh ghi rt or or rd, rs, rt R[rd] = R[rs] | R[rt]
Thực hiện or từng bit giá trị của thanh ghi rs và rt với
nhau, kết quả lưu vào thanh ghi rd nor nor rd, rs, rt R[rd] = ~(R[rs] | R[rt])
Thực hiện or từng bit giá trị của thanh ghi rs và rt với
nhau, sau đó lấy not của phép or đã thực hiện, kết quả lưu vào thanh ghi rd lw lw rt, address R[rt] = M[R[rs] + SignExtImm] (load word) address = offset(rs)
Lấy giá trị trong thanh ghi rs cộng với số tức thời đang
lưu trong offset được địa chỉ của từ nhớ cần lấy dữ liệu.
Dữ liệu nhớ này sẽ được lưu vào thanh ghi rt sw sw rt, address
[M[R[rs] + SignExtImm] = R[rt] (store word) address = offset(rs)
Lưu giá trị thanh ghi rt vào từ nhớ có địa chỉ được tính
bằng giá trị thanh ghi rs cộng với offset (offset được mở
rộng có dấu thành số 32 bits trước khi cộng) slt slt rd, rs, rt
R[rd] = (R[rs] < R[rt])? 1 : 0 (set less
Kiểm tra xem giá trị trong thanh ghi rs có nhỏ hơn thanh than)
ghi rt hay không, nếu nhỏ hơn thì thanh ghi rd nhận giá
trị là 1; ngược lại thanh ghi rd sẽ nhận giá trị 0 slti slti rt, rs, imm
R[rt] = (R[rs] < SignExtImm)? 1 : 0 (set less
Kiểm tra xem giá trị trong thanh ghi rs có nhỏ hơn một than Imm)
số tức thời hay không, nếu nhỏ hơn thì thanh ghi rt nhận
giá trị là 1; ngược lại thanh ghi rt sẽ nhận giá trị 0 sltu sltu rd, rs, rt
R[rd] = (R[rs] < R[rt])? 1 : 0 (set less
Ý nghĩa như slt nhưng slt thực hiện trên số có dấu, còn than
stlu thực hiện trên số không dấu unsigned) sltiu sltiu rt, rs, imm
R[rt] = (R[rs] < SignExtImm)? 1 : 0 (set less
Ý nghĩa như slti nhưng slti thực hiện trên số có dấu dạng than
bù 2, còn stliu thực hiện trên số không dấu Imm unsigned)
Trần Đại Dương – Khoa Kỹ thuật Máy tính, Trường Đại học Công nghệ Thông tin Youtube.com/DuongComputing
Facebook.com/groups/EmAnhDuong lOMoAR cPSD| 59285474 3 syscall syscall
Được sử dụng để thực hiện các lệnh hệ thống như đọc,
ghi dữ liệu, thoát chương trình, v.v.
Lệnh này cho phép chương trình yêu cầu hệ điều hành
thực hiện các tác vụ mà bản thân chương trình không thể thực hiện trực tiếp.
Trần Đại Dương – Khoa Kỹ thuật Máy tính, Trường Đại học Công nghệ Thông tin Youtube.com/DuongComputing
Facebook.com/groups/EmAnhDuong lOMoAR cPSD| 59285474 4 Ví dụ 1:
# Tạo biến số nguyên var1, chiếm 1 word lưu trữ, giá trị khởi tạo bằng 23 # t0 = 23 # t1 = 5 # var1 = t1 = 5
Trần Đại Dương – Khoa Kỹ thuật Máy tính, Trường Đại học Công nghệ Thông tin Youtube.com/DuongComputing
Facebook.com/groups/EmAnhDuong lOMoAR cPSD| 59285474 5
2.2 Mô phỏng các chương trình bên dưới và có biết ý nghĩa của chương trình:
nhau với lưu trữ chưa khởi tạo # t0 = địa chỉ array1 # t1 = 5
# Lưu 5 vào $t0 với offset = 0, từ bye
0 4 array1 lưu giá trị của $t1 # t1 = 13
# Lưu 13 vào $t0 với offset = 4, từ bye
4 8 array1 lưu giá trị của $t1 # t1 = -7
# Lưu -7 vào $t0 với offset = 8, từ bye
8 12 array1 lưu giá trị của $t1 Ví dụ 3: # Giá trị thanh ghi v0 = 5
# $v0 mang ý nghĩa là giá trị trả về của hàm hoặc biểu thức
#syscall thực thi chức năng theo giá trị thanh ghi v0,
ở đây là đọc số nguyên từ bàn phím (read_int) Ví dụ 2:
# Tạo 1 mảng array1 có 12 bytes liên tục
Trần Đại Dương – Khoa Kỹ thuật Máy tính, Trường Đại học Công nghệ Thông tin Youtube.com/DuongComputing
Facebook.com/groups/EmAnhDuong lOMoAR cPSD| 59285474 6 Ví dụ 4:
Tạo một chuỗi tên string1 với khởi tạo “Print this.\n”. Gán giá trị thanh ghi $v0 = 4 (thực
hiện lệnh in chuỗi ký tự ra màn hình (print_string)
Gán địa chỉ của nhãn string1 vào thanh ghi $a0 để đọc chuỗi
Lệnh syscall được thực thi
Trần Đại Dương – Khoa Kỹ thuật Máy tính, Trường Đại học Công nghệ Thông tin Youtube.com/DuongComputing
Facebook.com/groups/EmAnhDuong lOMoAR cPSD| 59285474 7 3. Bài tập
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 ^-^ Trả lời:
.data string1: .asciiz "Chao ban! Ban la sinh vien nam thu may?\n"
string2: .asciiz "Hihi, minh la sinh vien nam thu 1 ^-^" .text main: li $v0, 4
# Gọi hệ thống in chuỗi ký tự la $a0, string1
# Load địa chỉ string1 vào thanh ghi a0 syscall
# In chuỗi string1 ra màn hình li $v0, 4
# Gọi hệ thống in chuỗi ký tự la $a0, string2
# Load địa chỉ string2 vào thanh ghi a0 syscall
# In chuỗi string2 ra màn hình
Trần Đại Dương – Khoa Kỹ thuật Máy tính, Trường Đại học Công nghệ Thông tin Youtube.com/DuongComputing
Facebook.com/groups/EmAnhDuong lOMoAR cPSD| 59285474 8
b) Biểu diễn của 2 chuỗi trên dưới bộ nhớ là gì?
Địa chỉ 0x10010000: ‘C’ 0x10010001: ‘h’ 0x10010002: ‘a’
………. Tương tự với các ký tự sau
c) Xuất ra lại đúng chuỗi đã nhậpVí dụ:
Nhap: Truong Dai hoc Cong nghe Thong tin
Xuất: Truong Dai hoc Cong nghe Thong tin .data
Trần Đại Dương – Khoa Kỹ thuật Máy tính, Trường Đại học Công nghệ Thông tin Youtube.com/DuongComputing
Facebook.com/groups/EmAnhDuong lOMoAR cPSD| 59285474 9 buffer: .space 100
# Tạo một mảng tên buffer có 100 bytes liên tục nhau với lưu trữ chưa khởi tạo string: .asciiz "Nhap: "
# Chuỗi thông báo yêu cầu nhập string1: .asciiz "Xuat:
# Chuỗi thông báo xuất chuỗi " .text main: li $v0, 4
# Gọi hệ thống in chuỗi la $a0, string
# Load địa chỉ string vào thanh ghi a0 syscall
# Thực hiện in chuỗi string ra màn hình li $v0, 8
# Gọi hệ thống nhập chuỗi từ bàn phím la $a0, buffer
# Load địa chỉ buffer vào a0 (địa chỉ lưu chuỗi được nhập) li $a1, 100
# Kích thước của chuỗi ( tối đa 100 bytes) syscall
# Thực hiện nhập chuỗi li $v0, 4
# Gọi hệ thống in chuỗi la $a0, string1
# Load địa chỉ string1 vào thanh ghi a0 syscall
# Thực hiện in chuỗi string1 ra màn hình li $v0, 4
# Gọi hệ thống in chuỗi la $a0, buffer
# Load địa chỉ buffer vào thanh ghi a0 syscall
# Gọi hệ thống in chuỗi
d) Nhập vào 2 số nguyên sau đó xuất tổng của 2 số nguyên này .data
string: .asciiz "Nhap so nguyen: "
# Chuỗi thông báo yêu cầu nhập
Trần Đại Dương – Khoa Kỹ thuật Máy tính, Trường Đại học Công nghệ Thông tin Youtube.com/DuongComputing
Facebook.com/groups/EmAnhDuong lOMoAR cPSD| 59285474 10 string1: .asciiz "Ket qua: "
# Chuỗi thông báo kết quả .text li $v0, 4
# Gọi hệ thống in chuỗi la $a0, string
# Load địa chỉ string vào thanh ghi a0 syscall
# Thực hiện in chuỗi string ra màn hình li $v0, 5
# Gọi hệ thống nhập số nguyên từ bàn phím syscall
# Thực hiện nhập số nguyên add $t0, $v0, $zero
# Mục đích gán giá trị số nguyên vừa nhập vào $t0 li $v0, 4
# Gọi hệ thống in chuỗi la $a0, string
# Load địa chỉ string vào thanh ghi a0 syscall
# Thực hiện in chuỗi string ra màn hình li $v0, 5
# Gọi hệ thống nhập số nguyên từ bàn phím syscall
# Thực hiện nhập số nguyên add $t1, $v0, $zero
# Mục đích gán giá trị số nguyên vừa nhập vào $t1 add $t0, $t0, $t1
# Gán tổng của giá trị thanh ghi t0 và t1 vào t0 li $v0, 4
# Gọi hệ thống in chuỗi la $a0, string1
# Load địa chỉ string1 vào thanh ghi a0 syscall
# Thực hiện in chuỗi string1 ra màn hình li $v0, 1
# Gọi hệ thống in số nguyên ra màn hình la $a0, ($t0)
# Load địa chỉ $t0 vào $a0 syscall
# Thực hiện in số nguyên kết quả Hết
Trần Đại Dương – Khoa Kỹ thuật Máy tính, Trường Đại học Công nghệ Thông tin Youtube.com/DuongComputing
Facebook.com/groups/EmAnhDuong