HDTH Ki n trúc máy tính & H p Ngế B môn MMTVT - HCMUS
LP TNH HP NG MIPS
Mc đích
Làm quen vi hp ng MIPS.
Biết cách viết, biên dch và chy chương trình hp ng MIPS vi công c MARS.
Tóm tt lý thuyết
Hp ng (Assembly) là ngôn ng lp trình bc thp, nó gm tp các t khóa và t gi nh
rt gn vi ngôn ng máy (machine code).
Mi kiến trúc vi x lý đu có tp lnh (instruction set) riêng, do đó s có hp ng riêng dành
cho kiến trúc đó. đây, ta tp trung nghiên cu v hp ng dành cho kiến trúc MIPS. Môi
trường lp trình được s dng là chương trình MARS. MARS là môi trường lp trình gi lp
giúp ta viết, biên dch và chy hp ng MIPS trên các máy x86.
Cu trúc ca mt chương trình hp ng MIPS
.data # khai báo biến sau ch th này
...
.text # viết các lnh sau ch th này
main: # đim bt đu ca chương trình
Cách khai báo biến
tên_biến: kiu_lưu_trgiá_tr
Các kiu lưu tr h tr: .word, .byte, .asciiz .space
Lưu ý: tên_biến (nhãn) phi theo sau bi du hai chm (:)
Ví d :
var1: .word 3 # s nguyên 4-byte có giá tr khi to là 3
var2: .byte ’a’,’b’ # mng 2 phn t, khi to là a và b
var3: .space 40 # cp 40-byte b nh, chưa được khi to
1
HDTH Ki n trúc máy tính & H p Ngế B môn MMTVT - HCMUS
Các thanh ghi trong MIPS
Thanh ghi đa năng
STên Ý nghĩa
$0 $zero Hng s 0
$1 $at Assembler Temporary
$2-$3 $v0-$v1 Giá tr tr v ca hàm hoc biu thc
$4-$7 $a0-$a3 Các tham s ca hàm
$8-$15 $t0-$t7 Thanh ghi tm (không gi giá tr trong quá trình gi hàm)
$16-$23 $s0-$s7 Thanh ghi lưu tr (gi giá tr trong sut quá trình gi hàm)
$24-$25 $t8-$t9 Thanh ghi tm
$26-27 $k0-$k1 D tr cho nhân HĐH
$28 $gp Con tr toàn cc (global pointer)
$29 $sp Con tr stack
$30 $fp Con tr frame
$31 $ra Đa ch tr v
Thanh ghi HI và LO
Thao tác nhân ca MIPS có kết qu cha trong 2 thanh ghi HI và LO. Bit 0-31 thuc LO và
32-63 thuc HI.
Thanh ghi du phy đng
MIPS s dng 32 thanh ghi du phy đng đ biu din đ chính xác đơn ca s thc. Các
thanh ghi này có tên là : $f0 – $f31.
Đ biu din đ chính xác kép (double precision) thì MIPS s dng s ghép đôi ca 2 thanh
ghi có đ chính xác đơn.
2
HDTH Ki n trúc máy tính & H p Ngế B môn MMTVT - HCMUS
Cú pháp tng quát lnh MIPS
<tên-lnh> <r1>, <r2>, <r3>
r1: thanh ghi cha kết qu
r2: thanh ghi
r3: thanh ghi hoc hng s
Mt s lnh MIPS cơ bn
Ghi chú:
Rd: thanh ghi đích, Rs, Rt: thanh ghi ngun.
các lnh màu xanh là các lnh gi (pseudo instructions).
Lnh Load / Store <=> nap / luu
Đây là các lnh duy nht được phép truy xut b nh RAM trong tp lnh ca MIPS.
Cú pháp Ý nghĩa
lw Rd, RAM_src Chép 1 word (4 byte) ti v trí trong b nh RAM vào thanh ghi
lb Rd, RAM_src Chép 1 byte ti v trí trong b nh RAM vào byte thp ca thanh
ghi
sw Rs, RAM_dest Lưu 1 word trong thanh ghi vào v trí trong b nh RAM
sb Rs, RAM_dest Lưu 1 byte thp trong thanh ghi vào v trí trong b nh RAM
li Rd, value Khi to thanh ghi vi giá tr
la Rd, label Khi to thanh ghi vi đa ch ca nhãn
Nhóm lnh s hc:
Cú pháp Ý nghĩa
add Rd, Rs, Rt Rd = Rs + Rt (kết qu có du)
addi Rd, Rs, imm Rd = Rs + imm(hang so)
addu Rd, Rs, Rt Rd = Rs + Rt (kết qu không du)
sub Rd, Rs, Rt Rd = Rs - Rt
subu Rd, Rs, Rt Rd = Rs - Rt (kết qu không du)
mult Rs, Rt (Hi,Lo) = Rs * Rt
div Rs, Rt Lo = Rs / Rt (thương), Hi = Rs % Rt (s dư)
mfhi Rd Rd = Hi
mflo Rd Rd = Lo
move Rd, Rs Rd = Rs
3
HDTH Ki n trúc máy tính & H p Ngế B môn MMTVT - HCMUS
Nhóm lnh nhy
Cú pháp Ý nghĩa
j label Nhy không điu kin đến nhãn 'label'
jal label Lưu đa ch tr v vào $ra và nhy đến nhãn 'label' (dùng khi gi hàm)
jr Rs Nhy đến đa ch trong thanh ghi Rs (dùng đ tr v t li gi hàm)
bgez Rs, label Nhy đến nhãn 'label' nếu Rs >= 0
bgtz Rs, label Nhy đến nhãn 'label' nếu Rs > 0
blez Rs, label Nhy đến nhãn 'label' nếu Rs <= 0
bltz Rs, label Nhy đến nhãn 'label' nếu Rs < 0
beq Rs, Rt, label Nhy đến nhãn 'label' nếu Rs = Rt
Bgt Rs , i label Nhay den nhan “label” neu Rs>i
bne Rs, Rt, label Nhy đến nhãn 'label' nếu Rs != Rt
System Call:
Lnh syscall làm treo s thc thi ca chương trình và chuyn quyn điu khin cho HĐH
ược gi lp bi MARS). Sau đó, HĐH s xem giá tr thanh ghi $v0 đ xác đnh xem
chương trình mun nó làm vic gì.
Bng các system call
Dch vGiá tr trong $v0 Đi sY nghia Kết qu
print_int 1 $a0 = integer Xuat so nguyen
print_float 2 $f12 = float Xuat so thuc
print_double 3 $f12 = double Xuat chuoi
print_string 4 $a0 = string Xuat chuoi
print_character 11 $a0 = char Xuat ky tu
read_character 12 Nhap ky tu char (trong $v0)
read_int 5 Nhap so nguyen integer (trong $v0)
read_float 6 Nhap so thuc float (trong $f0)
read_double 7 Nhap so thuc
dai
double (trong $f0)
read_string 8 $a0 = buffer, $a1 = length Nhap chuoi
sbrk 9 $a0 = amount address (trong $v0)
exit 10
4
HDTH Ki n trúc máy tính & H p Ngế B môn MMTVT - HCMUS
Ví d :
.data # khai báo data segment
str: .asciiz “hello world”
.text
.globl main
main: # nhãn main cho vi x lý biết nơi thc thi lnh đu tiên
la $a0, str # ti đa ch ca nhãn str vào thanh ghi $a0
addi $v0, $zero, 4 # đưa giá tr 4 vào thanh ghi $v0 syscall
addi $v0, $zero, 10
syscall
Stack
Stack (ngăn xếp) là vùng nh đc bit được truy cp theo cơ
chế “vào trước ra sau” (LIFO – Last In First Out), nghĩa là d
liu nào đưa vào sau s được ly ra trước.
Hình bên là cu trúc stack trong b nh, mi phn t có kích
thước mt word (32-bit).
Thanh ghi $sp đóng vai trò là con tr ngăn xếp (stack
pointer), luôn ch đến đnh ca stack. Stack phát trin theo
chiu gim ca đa ch vùng nhnh ca stack luôn có đa ch thp).
Hai thao tác cơ bn trong stack là push (đưa mt phn t vào stack) và pop (ly mt phn t
ra khi stack). Cơ chế như sau:
push: gim $sp đi 4, lưu giá tr vào ô nh mà $sp ch đến.
Ví d : push vào stack giá tr trong $t0
subu $sp, $sp, 4
sw $t0, ($sp)
pop: copy giá tr trong vùng nh được ch đến bi $sp,
cng 4 vào $sp.
Ví d : pop t stack ra $t0
lw $t0, ($sp)
addu $sp, $sp, 4
Th tc
5