You are on page 1of 6

HỌ VÀ TÊN CÁC THÀNH VIÊN TRONG NHÓM:

1) HÀ XUÂN TỊNH 16DT2


2) TRẦN THỊ TRANG 16DT2
3) HOÀNG THANH TUẤN 16DT2
4) NGÔ HỮU HOÀNG VIỆT 16DT2

BÀI TẬP Ở NHÀ 02:


Môn: TỔ CHỨC MÁY TÍNH

1) Đối với câu lệnh C sau, mã MIPS tương ứng là gì? Giả sử các biến i và j được gán cho các
thanh ghi tương ứng $s0 và $s1. Giả sử địa chỉ cơ sở của các mảng A và B lần lượt nằm
trong các thanh ghi $s6 và $s7: B[8]=A[i-j];
GIẢI:
B[8]=A[i-j]; chuyển sang mã MIPS là:

sub $s2, $s0, $s1 # $s2=i-j


sll $s2, $s2, 2 # $s2=(i-j)*4
add $s2, $s6, $s2 # $s2=&A[i-j]
lw $s3, 0($s2) # $s3=A[i-j]
sw $s3, 32($s7) # B[8]=A[i-j]

2) Đối với các lệnh MIPS sau, câu lệnh C tương ứng là gì? Giả sử các biến f và g được gán
cho các thanh ghi tương ứng $s0 và $s1. Giả sử địa chỉ cơ sở của các mảng A và B lần lượt
nằm trong các thanh ghi $s6 và $s7:
GIẢI:

sll $t0, $s0, 2 # $t0=f*4


add $t0, $s6, $t0 # $t0=&A[f]
sll $t1, $s1, 2 # $t1=g*4
add $t1, $s7, $t1 # $t1=&B[g]
lw $s0, 0($t0) # f=A[f]
addi $t2, $t0, 4 # $t2=&A[f+1]
lw $t0, 0($t2) # $t0=A[f+1]
add $t0, $t0, $s0 # $t0=A[f+1]+A[f]
sw $t0, 0($t1) # B[g]=A[f+1]+A[f]
Vậy: Các câu lệnh C tương ứng là:

B[g]=A[f+1]+A[f];
f=A[f];

3) Đối với các lệnh MIPS trong Bài tập 2, hãy viết lại các lệnh để giảm thiểu số lượng các mã
MIPS (nếu có thể) cần để thực hiện chức năng tương tự.
GIẢI:
Viết lại các lệnh MIPS để giảm số lượng các mã MIPS, thực hiện chức năng tương tự:

sll $t0, $s0, 2 # $t0=f*4


add $t0, $s6, $t0 # $t0=&A[f]
lw $s0, 0($t0) # f=A[f]
lw $t1, 4($t0) # $t1=A[f+1]
add $t1, $t1, $s0 # $t1=A[f+1]+A[f]
sll $t2, $s1, 2 # $t2=g*4
add $t2, $s7, $t2 # $t2=&B[g]
sw $t1, 0($t2) # B[g]=A[f+1]+A[f]

4) Dịch mã MIPS sau sang ngôn ngữ máy:

addi $t0, $s6, 4


add $t1, $s6, $0
sw $t1, 0($t0)
lw $t0, 0($t0)
add $s0, $t1, $t0
GIẢI:
𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑛𝑔ô𝑛 𝑛𝑔ữ 𝑚á𝑦
addi $t0, $s6, 4 → 00100010110010000000000000000100
𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑑ạ𝑛𝑔 𝐻𝑒𝑥
→ 0x22C80004

𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑛𝑔ô𝑛 𝑛𝑔ữ 𝑚á𝑦


add $t1, $s6, $0 → 00000010110000000100100000100000
𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑑ạ𝑛𝑔 𝐻𝑒𝑥
→ 0x02C04820

𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑛𝑔ô𝑛 𝑛𝑔ữ 𝑚á𝑦


sw $t1, 0($t0) → 10101101000010010000000000000000
𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑑ạ𝑛𝑔 𝐻𝑒𝑥
→ 0xAD090000
𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑛𝑔ô𝑛 𝑛𝑔ữ 𝑚á𝑦
lw $t0, 0($t0) → 10001101000010000000000000000000
𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑑ạ𝑛𝑔 𝐻𝑒𝑥
→ 0x8D080000

𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑛𝑔ô𝑛 𝑛𝑔ữ 𝑚á𝑦


add $s0, $t1, $t0 → 00000001001010001000000000100000
𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑑ạ𝑛𝑔 𝐻𝑒𝑥
→ 0x01288020

5) Dịch mã C sau sang mã MIPS. Sử dụng một số lượng lệnh tối thiểu. Giả sử các giá trị của a,
b, i và j lần lượt nằm trong các thanh ghi $s0, $s1, $t0 và $t1. Ngoài ra, giả sử thanh ghi $s2
giữ địa chỉ cơ sở của mảng D:

for(i=0; i<a; i++)


for(j=0; j<b; j++)
D[4*j]=i+j;
GIẢI:
Chuyển sang mã MIPS là:

move $t0, $zero # i=0


for1: move $t1, $zero # j=0
for2: add $t2, $t0, $t1 # $t2=i+j
sll $s3, $t1, 4 # $s3=16*j
add $s3, $s2, $s3 # $s3=&D[4*j]
sw $t2, 0($s3) # D[4*j]=i+j
addi $t1, $t1, 1 # j=j+1
slt $t3, $t1, $s1 # $t3=(j<b)?1:0
bne $t3, $zero, for2 # if($t3!=0) go to for2
addi $t0, $t0, 1 # i=i+1
slt $t3, $t0, $s0 # $t3=(i<a)?1:0
bne $t3, $zero, for1 # if($t3!=0) go to for1

6) Chuyển đổi chương trình mã máy sau sang các lệnh của mã MIPS:

00011010010000000000000000000011
00100000000000000000000000000000
10101110001010110000000000000000
10101110001010100000000000000010
00100001001010010000000000001000
GIẢI:
𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑚ã 𝑀𝐼𝑃𝑆
00011010010000000000000000000011 → blez $s2, label
nop
nop
nop
label: nop

𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑚ã 𝑀𝐼𝑃𝑆


00100000000000000000000000000000 → addi $zero, $zero, 0

𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑚ã 𝑀𝐼𝑃𝑆


10101110001010110000000000000000 → sw $t3, 0($s1)

𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑚ã 𝑀𝐼𝑃𝑆


10101110001010100000000000000010 → sw $t2, 2($s1)

𝐶ℎ𝑢𝑦ể𝑛 𝑠𝑎𝑛𝑔 𝑚ã 𝑀𝐼𝑃𝑆


00100001001010010000000000001000 → addi $t1, $t1, 8

7) Giả lệnh không phải là một phần của tập lệnh MIPS nhưng thường xuất hiện trong các
chương trình MIPS. Trình biên dịch sau đó phải chuyển đổi chúng thành một tập hợp nhỏ
các lệnh MIPS. Đối với mỗi giả lệnh sau đây, hãy chuyển chúng thành một chuỗi tương
đương rất ngắn của các lệnh MIPS. Thanh ghi tạm thời là $at:

Lưu ý, “small” là một hằng số 16 bit( tức là đủ nhỏ cho trường trực tiếp của một lệnh) và
“big” là một hằng số 32 bit( tức là đủ dài cho trường tức thời)
GIẢI:
Thực hiện các giả lệnh:

li $t2, big # $t2=big (note: solved below)


→ lui $t2, big
ori $t2, $t2, big

move $t1, $t2 # $t1=$t2


→ add $t1, $t2, $zero

beq $t1, small, L # if($t1=small) go to L


→ addi $at, $zero, small
beq $t1, $at, L

ble $t3, $t4, L # if($t3<=$t4) go to L


→ slt $at, $t3, $t4
bne $at, $zero, L
beq $t3, $t4, L

addi $t0, $t2, big # $t0=$t2+big


→ lui $at, big
ori $at, $at, big
add $t0, $t2, $at
8) Giả sử muốn mở rộng thanh ghi MIPS lên tới 128 thanh ghi và mở rộng tập lệnh để chứa
gấp bốn lần số lệnh:
a. Làm thế nào điều này sẽ ảnh hưởng đến kích thước của từng trường bit trong định dạng
loại R?
b. Làm thế nào điều này sẽ ảnh hưởng đến kích thước của từng trường bit trong định dạng
loại I?
GIẢI:
a. Mở rộng thanh ghi MIPS thành 128 thanh ghi thì ta phải thêm 2 bit vào mỗi trường rs, rt
và rd, tức là tăng mỗi trường trong định dạng loại R lên 7 bit mỗi trường. Giả sử cứ gấp
4 lần số lệnh thì các lệnh sẽ mở rộng trường opcode thêm 2 bit để thành 8 bit.( Tuy
nhiên, trường opcode có các giá trị dành riêng phù hợp với từng lệnh mà không cần mở
rộng).
b. Mở rộng thanh ghi MIPS thành 128 thanh ghi thì ta phải thêm 2 bit vào mỗi trường rs và
rt, tức là tăng mỗi trường trong định dạng loại I lên 7 bit mỗi trường. Giả sử cứ gấp 4 lần
số lệnh thì các lệnh sẽ mở rộng trường opcode thêm 2 bit để thành 8 bit.( Tuy nhiên,
trường opcode có các giá trị dành riêng phù hợp với từng lệnh mà không cần mở rộng).

9) Tìm chuỗi lệnh MIPS ngắn nhất xuất các bit từ 16 xuống 11 từ thanh ghi $t0 và sử dụng giá
trị của trường này để thay thế các bit từ 31 xuống 26 trong thanh ghi $t1 mà không thay đổi
26 bit khác của thanh ghi $t1.
GIẢI:
Chuỗi lệnh MIPS thực hiện các nhiệm vụ trên là:

srl $t2, $t0, 11


sll $t2, $t2, 26
sll $t1, $t1, 6
srl $t1, $t1, 6
add $t1, $t1, $t2

10) Chỉ ra cách giá trị 0xabcdef12 sẽ được sắp xếp trong bộ nhớ của một little-endian và big-
endian. Giả sử dữ liệu được lưu trữ bắt đầu từ địa chỉ 0.
GIẢI:
Cách sắp xếp giá trị 4 byte 0xabcdef12 trong bộ nhớ là:

Địa chỉ Big-endian Little-endian


0 ab 12
1 cd ef
2 ef cd
3 12 ab

You might also like