HỆ THỐNG MÁY TÍNH
04 – BỘ LỆNH MIPS 32 bit
Gii thiu
2
ă
Nhim v c bn nht ca CPU l phi thc
hin cỏc lnh c yờu cu, gi l instruction
ă
Cỏc CPU sẽ sử dụng các tập lệnh (instruction
set) khác nhau để có thể giao tiếp với nó
Kớch thc lnh
3
ă
ă
Kớch thc lnh b nh hng bi:
Ô
Cu trỳc ng truyn bus
Ô
Kớch thc v t chc b nh
Ô
Tc CPU
Gii phỏp ti u lnh:
Ô
Dựng lnh cú kớch thc ngn, mỗi lệnh chỉ nên được
thực thi trong đúng 1 chu k CPU
Ô
Dựng b nh cache
B lnh MIPS
4
ă
Chỳng ta s lm quen vi tp lnh cho kin trỳc MIPS
(PlayStation 1, 2; PSP; Windows CE, Routers)
ă
c xõy dng theo kin trỳc (RISC) vi 4 nguyờn tc:
Ô
Cng n gin, cng n nh
Ô
Cng nh gn, x lý cng nhanh
Ô
Tng tc x lý cho nhng trng hp thng xuyờn xy ra
Ô
Thit k ũi hi s tha hip tt
Cấu trúc cơ bản của 1 chương trình hợp
ngữ trên MIPS
5
.data
# khai báo các data label (có thể hiểu là các biến)
# sau chỉ thị này
label1: <kiểu lưu trữ> <giá trị khởi tạo>
label2: <kiểu lưu trữ> <giá trị khởi tạo>
…
.text
# viết các lệnh sau chỉ thị này
.globl <các text label tồn cục, có thể truy xuất từ các file khác>
.globl main
# Đây là text label toàn cục bắt buộc của program
…
main:
…
# điểm text label bắt đầu của program
Hello.asm
6
.data
str:
# data segment
.asciiz “Hello asm !”
.text
.globl
# text segment
main
main:
# starting point of program
addi $v0, $0, 4
# $v0 = 0 + 4 = 4 à print str syscall
la $a0, str
# $a0 = address(str)
syscall
# excute the system call
B lnh MIPS Thanh ghi
7
ă
L n v lu tr data duy nht trong CPU
ă
Trong kin trỳc MIPS:
Ô
Ô
Cú tng cng 32 thanh ghi đánh số từ $0 à $31
n
Càng ít càng dễ quản lý, tính tốn càng nhanh
n
Có thể truy xuất thanh ghi qua tên của nó (slide sau)
Mỗi thanh ghi có kích thước cố định 32 bit
n
Bị giới hạn bởi khả năng tính tốn của chip xử lý
n
Kích thước toán hạng trong các câu lệnh MIPS bị giới hạn ở
32 bit, nhóm 32 bit gọi là từ (word)
Thanh ghi toỏn hng
8
ă
Nh chỳng ta ó bit khi lp trình, biến
(variable) là khái niệm rất quan trọng khi
muốn biểu din cỏc toỏn hng tớnh toỏn
ă
Trong kin trỳc MIPS khơng tồn tại khái niệm
biến, thay vào đó là thanh ghi toán hạng
Thanh ghi toỏn hng
9
ă
Ngụn ng cp cao (C, Java): toỏn hng = bin (variable)
Ô
ă
ă
Cỏc bin lu trong b nh chớnh
Ngụn ngữ cấp thấp (Hợp ngữ): toán hạng chứa trong các thanh ghi
Ô
Thanh ghi khụng cú kiu d liu
Ô
Kiu d liu thanh ghi được quyết định bởi thao tác trên thanh ghi
So sỏnh:
Ô
u: Thanh ghi truy xut nhanh hn nhiu b nh chớnh
Ô
Khuyt: Khụng nh b nh chớnh, thanh ghi l phần cứng có số lượng
giới hạn và cố định à Phải tính tốn kỹ khi sử dụng
Mt s thanh ghi toỏn hng quan tõm
10
ă
Save register:
Ô
MIPS ly ra 8 thanh ghi ($16 - $23) dùng để thực hiện các phép
tính số học, được đặt tên tương ứng l $s0 - $s7
Ô
ă
Tng ng trong C, cha giỏ tr bin (variable)
Temporary register:
Ô
MIPS ly ra 8 thanh ghi ($8 - $15) dùng để chứa kết quả trung
gian, được đặt tờn tng ng l $t0 - $t7
Ô
Tng ng trong C, để chứa giá trị biến tạm (temporary
variable)
Bảnh danh sách thanh ghi MIPS
11
Thanh ghi 1 ($at) để dành cho assembler. Thanh ghi 26 – 27 ($k0 - $k1) để dành cho OS
B lnh MIPS 4 thao tỏc chớnh
12
ă
Phn 1: Phộp toỏn s hc (Arithmetic)
ă
Phn 2: Di chuyn d liu (Data transfer)
ă
Phn 3: Thao tỏc lun lý (Logical)
ă
Phn 4: R nhỏnh (Un/Conditional branch)
Phn 1: Phộp toỏn s hc
13
ă
Cỳ phỏp:
opt
opr, opr1, opr2
Ô
opt (operator): Tờn thao tỏc (toỏn t, tỏc t)
Ô
opr (operand): Thanh ghi (toỏn hng, tỏc t ớch)
cha kt qu
Ô
opr1 (operand 1): Thanh ghi (toỏn hng ngun 1)
Ô
opr2 (operand 2): Thanh ghi / hằng số
(toán hạng nguồn 2)
Vớ d
14
ă
Gi s xột cõu lnh sau:
add a, b, c
Ô Ch
th cho CPU thc hin phộp cng
aòb+c
Ô a,
b, c c gi l thanh ghi toỏn hng
Ô Phộp
toỏn trờn ch cú thể thực hiện với đúng 3
tốn hạng (khơng nhiều cũng khơng ít hơn)
Cng, tr s nguyờn
15
ă
Cng (Add):
Ô
Cng cú du:
add
$s0, $s1, $s2
Ô
Cng khụng du:
addu $s0, $s1, $s2
Ô
Din gii:
$s0 ò $s1 + $s2
(u: unsigned)
C/C++: (a = b + c)
ă
Tr (Subtract):
Ô
Tr cú du:
sub
$s0, $s1, $s2
Ô
Tr khụng du:
subu $s0, $s1, $s2
Ô
Din gii:
$s0 ò $s1 - $s2
C/C++: (a = b - c)
(u: unsigned)
Nhn xột
16
ă
Toỏn hng trong cỏc lnh trờn phi l thanh ghi
ă
Trong MIPS, lnh thao tỏc vi s nguyờn cú du c biu din
di dng bự 2
ă
Lm sao bit 1 phộp tốn được biên dịch từ C (ví dụ a = b + c) là
thao tác có dấu hay khơng dấu? Da vo trỡnh biờn dch
ă
Cú th dựng 1 toỏn hng va l ngun va l ớch
add $s0, $s0, $s1
ă
Cng, trừ với hằng số? à $s2 sẽ đóng vai trị l hng s
Ô
Cng: addi $s0, $s1, 3
Ô
Tr:
addi
$s0, $s1, -3
(addi = add immediate)
Vớ d 1
17
ă
Chuyn thnh lnh MIPS t lnh C:
a=b+c+de
ă
ă
Chia nh thành nhiều lệnh MIPS:
add
$s0, $s1, $s2
# a=b+c
add
$s0, $s0, $s3
# a=a+d
sub
$s0, $s0, $s4
# a=a–e
Tại sao dùng nhiều lệnh hơn C?
à Bị giới hạn bởi số lượng cổng mạch toán tử và thit k bờn trong cng
mch
ă
Ký t # dựng chỳ thích trong hợp ngữ cho MIPS
Vớ d 2
18
ă
Chuyn thnh lnh MIPS t lnh C:
f = (g + h) (i + j)
ă
Chia nh thnh nhiu lệnh MIPS:
add
$t0, $s1, $s2
# temp1 = g + h
add
$t1, $s3, $s4
# temp2 = i + j
sub
$s0, $t0, $t1
# f = temp1 – temp2
Lu ý: Phộp gỏn ?
19
ă
Kin trỳc MIPS khụng cú cng mạch dành riêng
cho phép gán
à Giải pháp: Dùng thanh ghi zero ($0 hay $zero)
luụn mang giỏ tr 0
ă
Vớ d:
add $s0, $s1, $zero
Tương đương: $s0 = $s1 + 0 = $s1 (gỏn)
ă
Lnh add $zero, $zero, $s0 cú hp l ?
Phộp nhõn, chia s nguyờn
20
ă
Thao tỏc nhõn / chia ca MIPS có kết quả
chứa trong cặp 2 thanh ghi tên là $hi và $lo
Bit 0-31 thuộc $lo và 32-63 thuộc $hi