Professional Documents
Culture Documents
05 Lap Trinh HN Phan 2
05 Lap Trinh HN Phan 2
05 Lap Trinh HN Phan 2
HP NG
ThS V Minh Tr vmtri@fit.hcmus.edu.vn
04 Lp trnh hp ng (Phn 2)
Gii thiu
2
Tc CPU
Dng lnh c kch thc ngn, mi lnh ch nn c thc thi trong ng 1 chu k CPU Dng b nh cache
B lnh MIPS
4
Chng ta s lm quen vi tp lnh cho kin trc MIPS (PlayStation 1, 2; PSP; Windows CE, Routers)
.data
# sau ch th ny
label1: <kiu lu tr> <gi tr khi to> label2: <kiu lu tr> <gi tr khi to> .text # vit cc lnh sau ch th ny
.globl <cc text label ton cc, c th truy xut t cc file khc> .globl main # y l text label ton cc bt buc ca program
Hello.asm
6
.data str: .asciiz Hello asm ! .text .globl main: addi $v0, $0, 4 main
# data segment
# text segment
la $a0, str
syscall
# $a0 = address(str)
# excute the system call
Nh chng ta bit khi lp trnh, bin (variable) l khi nim rt quan trng khi mun biu din cc ton hng tnh ton
Trong kin trc MIPS khng tn ti khi nim bin, thay vo l thanh ghi ton hng
Ngn ng cp thp (Hp ng): ton hng cha trong cc thanh ghi
Thanh ghi khng c kiu d liu Kiu d liu thanh ghi c quyt nh bi thao tc trn thanh ghi
So snh:
u: Thanh ghi truy xut nhanh hn nhiu b nh chnh Khuyt: Khng nh b nh chnh, thanh ghi l phn cng c s lng gii hn v c nh Phi tnh ton k khi s dng
Save register:
Temporary register:
MIPS ly ra 8 thanh ghi ($8 - $15) dng cha kt qu trung gian, c t tn tng ng l $t0 - $t7 Tng ng trong C, cha gi tr bin tm (temporary variable)
Thanh ghi 1 ($at) dnh cho assembler. Thanh ghi 26 27 ($k0 - $k1) dnh cho OS
Phn 1: Php ton s hc (Arithmetic) Phn 2: Di chuyn d liu (Data transfer) Phn 3: Thao tc lun l (Logical) Phn 4: R nhnh (Un/Conditional branch)
C php: opt
V d
14
Gi s xt cu lnh sau:
add a, b, c
Ch
ab+c
a,
Php
Cng, tr s nguyn
15
Cng (Add):
Cng c du:
Cng khng du: Din gii:
add
C/C++: (a = b + c)
Tr (Subtract):
sub
Nhn xt
16
V d 1
17
a=b+c+de
Chia nh thnh nhiu lnh MIPS: add $s0, $s1, $s2 # a=b+c
add
sub
# a=a+d
# a=ae
V d 2
18
Chia nh thnh nhiu lnh MIPS: add add sub $t0, $s1, $s2 $t1, $s3, $s4 $s0, $t0, $t1 # temp1 = g + h # temp2 = i + j # f = temp1 temp2
Lu : Php gn ?
19
Kin trc MIPS khng c cng mch dnh ring cho php gn
lun mang gi tr 0
Thao tc nhn / chia ca MIPS c kt qu cha trong cp 2 thanh ghi tn l $hi v $lo Bit 0-31 thuc $lo v 32-63 thuc $hi
Php nhn
21
C php:
mult $s0, $s1
$lo (32 bit) = (($s0 * $s1) << 32) >> 32 $hi (32 bit) = ($s0 * $s1) >> 32
mflo mfhi
$s0 $s0
Php chia
22
C php:
div $s0, $s1
Thao tc s du chm ng
23
MIPS s dng 32 thanh ghi du phy ng biu din chnh xc n ca s thc. Cc thanh ghi ny c tn l : $f0 $f31.
biu din chnh xc kp (double precision) th MIPS s dng s ghp i ca 2 thanh ghi c chnh xc n.
Vn trn s
24
xy ra
Mt s ngn ng c kh nng pht hin trn s (Ada), mt s khng (C) MIPS cung cp 2 loi lnh s hc:
add, addi, sub: Pht hin trn s addu, addiu, subu: Khng pht hin trn s
Trnh bin dch C trn kin trc MIPS s dng addu, addiu, subu
Mt s nhn xt:
Ngoi cc bin n, cn c cc bin phc tp th hin nhiu kiu cu trc d liu khc nhau, v d nh array
26
B nh chnh
27
Cc nh c nh s th t t 0 tr i
Gi l a ch (address) nh
Cu trc lnh
28
C php: opt
opt (operator): Tn thao tc (Load / Save) opr (operand): Thanh ghi lu t nh (word) opr1 (operand 1): Hng s nguyn
lw: Np 1 t d liu, t b nh, vo 1 thanh ghi trn CPU (Load Word - lw) lw $t0, 12 ($s0)
Np t nh c a ch ($s0 + 12) cha vo thanh ghi $t0
sw: Lu 1 t d liu, t thanh ghi trn CPU, ra b nh (Store Word sw) sw $t0, 12 ($s0)
Lu gi tr trong thanh ghi $t0 vo nh c a ch ($s0 + 12)
Lu 1
30
Lu 2
31
Mt thanh ghi c lu bt k gi tr 32 bit no, c th l s nguyn (c du / khng du), c th l a ch ca 1 vng nh trn RAM
V d:
lw
Lu 3
32
Gii php:
Thanh
V d 1
33
Gi s A l 1 array gm 100 t vi a ch bt u (a ch
V d 2
34
lw
$t0, 32($s3)
Restriction
Endian
Alignment Restriction
36
Restriction
Nh vy, t nh phi bt u ti a ch l bi s ca 4
Big Endian
37
MIPS lu tr th t cc byte trong 1 word trong b nh theo nguyn tc Big Endian (Kin trc x86 s dng Little Endian)
2 3
56 78
34 12
Lu
38
(offset) phi l bi s ca 4
Ngoi vic h tr load, save 1 t (lw, sw), MIPS cn h tr load, save tng byte (ASCII)
V d: lb $s0, 3 ($s1) Lnh ny np gi tr byte nh c a ch ($s1 + 3) vo byte thp ca thanh ghi $s0
Nguyn tc
40
Gi tr thanh ghi trn CPU (32 bit) sau khi np c dng: xxxx xxxx xxxx xxxx xxxx xxxx xzzz zzzz
V d:
lh $s0, 3 ($s1) Lnh ny np gi tr 2 byte nh c a ch ($s1 + 3) vo 2 byte thp ca thanh ghi $s0
Cc thao tc lun l xem d liu trong thanh ghi l dy 32 bit ring l thay v 1 gi tr n
C php: opt
and, or, nor: Ton hng ngun th 2 (opr2) phi l thanh ghi andi, ori: Ton hng ngun th 2 (opr2) l hng s
C php: opt
opt (operator): Tn thao tc opr (operand): Thanh ghi (ton hng ch) cha kt qu
opr1 (operand 1): Thanh ghi (ton hng ngun 1) opr2 (operand 2): Hng s < 32 (S bit dch)
Dch lun l
Dch s hc
V d
47
(85 * 22)
$s2 = 0000 0000 0000 0000 0000 0000 0101 0101 = 85 $s1 = 0000 0000 0000 0000 0000 0000 0001 0101 = 21
(85 / 22)
$s2 = 1111 1111 1111 1111 1111 1111 1111 0000 = -16 $s1 = 1111 1111 1111 1111 1111 1111 1111 1100 = -4 (-16 / 22)
Phn 4: R nhnh
48
clause2
clause2
goto L2 L1: clause1
// else Lm clause2
// Lm tip cc lnh khc
L2:
R nhnh c iu kin
bne: Branch if (register are) not equal if (opr1 != opr2) goto label
j label
V d
50
if (i == j)
else
f = g + h;
f = g h;
Lnh hp ng MIPS:
beq $s3, $s4, TrueCase sub $s0, $s1, $s2 j Fin # branch (i == j) # f = g h (false) # goto Fin label # f = g + h (true)
TrueCase: Fin:
X l vng lp
51
do {
g = g + A[i]; i = i + j; } while (i != h);
X l vng lp
52
g
$s1
h
$s2
i
$s3
j
$s4
base address of A
$s5
Loop:
sll
$t1, $s3, 2
# $t1 = i * 22
# $t1 = addr A[i] # $t1 = A[i]
# g = g + A[i]
#i=i+j # if (i != j) goto Label
X l vng lp
53
while for
dowhile
Nguyn tc chung:
slt opr1, opr2, opr3 slt: Set on Less Than if (opr2 < opr3) opr1 = 1;
else
opr1 = 0;
slt
Nhn xt: Thanh ghi $0 lun cha gi tr 0, nn lnh bne v bep thng dng so snh sau lnh slt
Cc php so snh cn li nh >, , th sao? MIPS khng trc tip h tr cho cc php so snh trn, tuy nhin da vo cc lnh slt, bne, beq ta hon ton c th biu din chng!
a: $s0, b: $s1
57
a<b slt $t0, $s0, $s1 # if (a < b) then $t0 = 1 # if (a < b) then goto Label # else then do something
a>b slt $t0, $s1, $s0 # if (b < a) then $t0 = 1 # if (b < a) then goto Label # else then do something
ab slt $t0, $s0, $s1 # if (a < b) then $t0 = 1 # if (a b) then goto Label
<do something>
ab slt $t0, $s1, $s0 # if (b < a) then $t0 = 1 # if (b a) then goto Label # else then do something
Nhn xt
58
So snh == Dng lnh beq So snh != Dng lnh bne So snh < v > Dng cp lnh (slt bne) So snh v Dng cp lnh (slt beq)
So snh vi hng s
59
So snh bng: beq / bne So snh khng bng: MIPS h tr sn lnh slti
slti
Thng
V d: switchcase trong C
60
switch (k) {
case 0: f = i + j; break;
case 1: f = g + h; break; case 2: f = g - h; break; }
else if (k == 1) else if (k == 2)
V d: switchcase trong C
61
bne
add j L1: addi bne add j
$s5, $0, L1
$s0, $s3, $s4 Exit $t0, $s5, -1 $t0, $0, L2 $s0, $s1, $s2 Exit
# if (k != 0) then goto L1
# else (k == 0) then f = i + j # end of case Exit (break) # $t0 = k 1 # if (k != 1) then goto L2 # else (k == 1) then f = g+ h # end of case Exit (break)
L2:
addi
bne sub
$t0, $s5, -2
$t0, $0, Exit $s0, $s1, $s2
# $t0 = k 2
# if (k != 2) then goto Exit # else (k == 2) then f = g - h
Exit:
/* a: $s0, b: $s1 */
63
M I
P
S
1004
1008 1012
add
addi j
#y=b
# lu a ch lt sau quay v vo $ra = 1016 # nhy n nhn sum
1016
. 2000 2024
sum: jr
add $ra
$a0
$v0 $s0
$a1
$v1 $s1
$a2
$a3
$s7
$ra
/* a: $s0, b: $s1 */
Nhn xt
return x + y;
65
NHN XT 1
P
S
1004
1008 1012
add
addi j
1016
. 2000 2024
sum: jr
add $ra
/* a: $s0, b: $s1 */
Nhn xt
return x + y;
66
NHN XT 2
P
S
1004
1008 1012
add
addi j
1016
. 2000 2024
MIPS h tr lnh mi: jal (jump and link) thc hin 2 cng vic trn: 1008 jal sum # $ra = 1012, goto sum
sum: jr
add $ra
Ti sao cn xc tng minh a $v0, $a0, $a1 #khng thc hin thnh tc sum
Cc lnh nhy mi
67
jr (jump register)
C php:
jr register
Din gii: Nhy n a ch nm trong thanh ghi register thay v nhy n 1 nhn nh lnh j (jump)
C php:
jal label
Bc 1 (link): Lu a ch ca lnh k tip vo thanh ghi $ra (Ti sao khng phi l a ch ca lnh hin ti ?) Bc 2 (jump): Nhy n nhn label
jal: t ng lu a ch quay v chng trnh chnh vo thanh ghi $ra v nhy n th tc con jr $ra: Quay li thn chng trnh chnh bng cch nhy n a ch c lu trc trong $ra
Bi tp
68
void main() {
int i, j, k, m;
i = mult (j, k); m = mult (i, i);
Th tc lng nhau
69
Nh vy cn phi lu li (backup) trong b nh chnh a ch quay v ca th tc sumSquare (trong thanh ghi $ra) trc khi gi th tc mult
Ngn xp (Stack)
70
Thng cha a ch tr v, cc bin cc b ca trnh con, nht l cc bin c cu trc (array, list) khng cha va trong cc thanh ghi trong CPU
push: a d liu t thanh ghi vo stack pop: Ly d liu t stack chp vo thanh ghi
71 M
sumSquare:
init push push
addi
$sp, $sp, -8
sw $ra, 4 ($sp)
P
S
sw $a1, 0 ($sp)
add $a1, $a0, $zero jal mult
# ct gi tr y vo stack
# gn tham s th 2 l x (ban u l y) phc v cho th tc mult sp gi # nhy n th tc mult # sau khi thc thi xong th tc mult , khi phc li tham s th 2 = y
pop
lw $a1, 0 ($sp)
# mult() + y # khi phc a ch quay v ca th tc sumSquare t stack, a li vo $ra # khi phc 8 byte gi tr $sp ban u mn, kt thc stack # nhy n on lnh ngay sau khi gi th tc sumSquare trong chng # trnh chnh, thao tc tip cc lnh khc.
mult: jr $ra # lnh x l cho th tc mult # nhy li on lnh ngay sau khi gi th tc mult trong th tc sumSquare
Khi to stack (init) Lu tr tm cc d liu cn thit vo stack (push) Gn cc i s (nu c) Gi lnh jal nhy n cc th tc con Khi phc cc d liu lu tm t stack (pop) Khi phc b nh, kt thc stack (free)
C th ha
73
u th tc: Procedure_Label: addi $sp, $sp, framesize sw $ra, framesize 4 ($sp) # khi to stack, dch chuyn stack pointer $sp li # ct $ra (kch thc 4 byte) vo stack (push)
Thn th tc:
jal other_procedure # Gi cc th tc khc (nu cn)
Cui th tc: lw $ra, frame_size 4 ($sp) lw addi $sp, $sp, framesize jr $ra # khi phc $ra t stack (pop) # khi phc cc thanh ghi khc (nu cn) # khi phc $sp, gii phng stack # nhy n lnh tip theo Procedure Label
$ra: (C th thay i) Khi gi lnh jal s lm thay i gi tr thanh ghi ny. Th tc gi (caller) lu li (backup) gi tr ca thanh ghi $ra vo stack nu cn $v0 - $v1: (C th thay i) Cha kt qu tr v ca th tc $a0 - $a1: (C th thay i) Cha i s ca th tc
Tm tt
77
Nu th tc R gi th tc E:
Bng tm tt
78
System call
79
Hello.asm
80
.data str: .asciiz Hello asm ! .text .globl main: addi $v0, $0, 4 main
# data segment
# text segment
la $a0, str
syscall
# $a0 = address(str)
# excute the system call
81
$0 $1 $2 $3 $4 $5 $7 $8 $9 $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $20 $21 $22 $23 $24 $25 $26 $27 $28 $29 $30 $31
$zero $at $v0 $v1 $a0 $a1 $a2 $a3 $t0 $t1 $t2 $t3 $t4 $t5 $t6 $t7 $s0 $s1 $s2 $s3 $s4 $s5 $s6 $s7 $t8 $t9 $k0 $k1 $gp $sp $fp $ra
82$6
Procedure arguments
Saved
Temporary values
Operands
More temporaries Reserved for OS (kernel) Global pointer Stack pointer Frame pointer Return address Saved
Ph lc 1: 40 lnh c bn MIPS
83 Instruction
Load upper immediate Add Subtract Set less than
Usage
lui add sub slt rt,imm rd,rs,rt rd,rs,rt rd,rs,rt
Instruction
Move from Hi Move from Lo Add unsigned Subtract unsigned Multiply Multiply unsigned
Usage
mfhi mflo addu subu mult rd rd rd,rs,rt rd,rs,rt rs,rt
Add immediate
Set less than immediate AND
addi
slti and
rt,rs,imm
rd,rs,imm rd,rs,rt
multu rs,rt
Divide
Divide unsigned Add immediate unsigned Shift left logical Shift right logical Shift right arithmetic Shift left logical variable Shift right logical variable Shift right arith variable Load byte Load byte unsigned Store byte Jump and link System call
div
divu
rs,rt
rs,rt
OR
XOR NOR AND immediate OR immediate XOR immediate Load word Store word Jump Jump register Branch less than 0 Branch equal Branch not equal
or
xor nor andi ori xori lw sw j jr bltz beq bne
rd,rs,rt
rd,rs,rt rd,rs,rt rt,rs,imm rt,rs,imm rt,rs,imm rt,imm(rs) rt,imm(rs) L rs rs,L rs,rt,L rs,rt,L
addiu rs,rt,imm sll srl sra sllv srlv srav lb lbu sb jal rd,rt,sh rd,rt,sh rd,rt,sh rd,rt,rs rd,rt,rs rd,rt,rs rt,imm(rs) rt,imm(rs) rt,imm(rs) L
syscall
Ph lc 2: Pseudo Instructions
84
Lnh gi: Mc nh khng c h tr bi MIPS L nhng lnh cn phi bin dch thnh rt nhiu cu lnh tht trc khi c thc hin bi phn cng
Lnh gi = Th tc
Dng h tr lp trnh vin thao tc nhanh chng vi nhng thao tc phc tp gm nhiu bc
Thc s MIPS khng c lnh ny, khi chy s bin dch lnh ny thnh cc lnh tht
sau: # Tr tuyt i ca X l X nu X < 0, l X nu X >= 0 abs: sub slt bne $s1, $zero, $s0 $t0, $s0, $zero $t0, $zero, done
add
done: jr
$ra
rd = rs rd = address (rs)
Load Immediate
Branch greater than Branch less than Branch greater than or equal
li rd, imm
bgt rs, rt, Label blt rs, rt, Label bge rs, rt, Label
if(R[rs]<=R[rt]) PC=Label
if(R[rs]<=R[rt]) PC=Label if(R[rs] >=0) PC=Label
R-format: Dng trong cc lnh tnh ton s hc (add, sub, and, or, nor, sll, srl, sra) I-format: Dng trong cc lnh thao tc vi hng s, chuyn d liu vi b nh, r nhnh J-format: Dng trong cc lnh nhy (jump C: goto)
R-format
89
6 bits opcode
5 rs
5 rt
5 rd
5 shmat
6 funct
rs (source register): thanh ghi ngun, thng cha ton hng ngun th 1 rt (target register): thanh ghi ngun, thng cha ton hng ngun th 2 rd (destination register): thanh ghi ch, thng cha kt qu lnh shamt: cha s bit cn dch trong cc lnh dch, nu khng phi lnh dch th trng ny c gi tr 0
Nhn xt
90
Trng lu s bit cn dch shamt c kch thc 5 bit C kh nng biu din cc s t 0 n 31
V d R-format (1)
91
opcode 0 000000
rs 9 01001
rt 10 01010
rd 8 01000
shmat 0 00000
funct 32 100000
opcode = 0 funct = 32
rs = 9 (ton hng ngun th 1 l $t1 ~ $9) rt = 10 (ton hng ngun th 2 l $t2 ~ $10) rd = 8 (ton hng ch l $t0 ~ $8) shmat = 0 (khng phi lnh dch)
V d R-format (2)
92
opcode 0 000000
rs 0 00000
rt 16 10000
rd 10 01010
shmat 4 00100
funct 0 000000
opcode = 0 funct = 0
Xc nh thao tc dch tri lun l (tt c cc lnh theo cu trc R-format u c opcode = 0)
rs = 0 (khng dng trong php dch) rt = 16 (ton hng ngun l $s0 ~ $16) rd = 10 (ton hng ch l $t2 ~ $10) shmat = 4 (s bit dch = 4)
Vn ca R-format
93
Lm sao gii quyt trng hp nu cu lnh i hi trng dnh cho ton hng phi
ln hn 5 bit?
V d:
Lnh addi cng gi tr thanh ghi vi 1 hng s, nu gii hn trng hng s 5 bit hng s khng th ln hn 25 = 32
Lnh lw, sw cn biu din 2 thanh ghi v 1 hng s offset, nu gii hn 5 bit
Lnh beq, bne cn biu din 2 thanh ghi v 1 hng s cha a ch (nhn) cn nhy, nu gii
hn 5 bit
Gii hn lu tr chng trnh trong b nh
Gii php: Dng I-format cho cc lnh thao tc hng s, truy xut d liu b nh v r nhnh
I-format
94
6 bits opcode
5 rs
5 rt
16 immediate
opcode (operation code): m thao tc, cho bit lnh lm g (tng t opcode ca Rformat, ch khc khng cn thm trng funct)
y cng l l do ti sao R-format c 2 trng 6 bit xc nh lnh lm g thay v 1 trng 12 bit nht qun vi cc cu trc lnh khc (I-format) trong khi kch thc mi trng vn hp l
rs (source register): thanh ghi ngun, thng cha ton hng ngun th 1 rt (target register): thanh ghi ch, thng cha kt qu lnh immediate: 16 bit, c th biu din s nguyn t -215 n (215 1)
V d I-format
95
Vn I-format
96
Trng hng s (immediate) c kch thc 16 bit Nu mun thao tc vi cc hng s 32 bit? Tng kch thc trng immediate thnh 32 bit? Tng kch thc cc lnh thao tc vi hng s c cu trc I-format
Vn I-format (tt)
97
Load
ghi
Gi
Lnh
V d
98
Khng th dng: addi $t0, $t0, 0xABABCDCD Gii php dng lnh lui: lui $at, 0xABAB
ori
add
Trong MIPS, thanh ghi PC (Program Counter) s cha a ch ca lnh ang c thc hin immediate: s c du, cha khong cch so vi a ch lnh ang thc hin nm trong thanh ghi PC
immediate + PC a ch cn nhy ti
Cch xc nh a ch ny gi l PC-Relative
Xem slide Addressing Mode (phn sau) bit thm v cc Addressing mode trong MIPS
Mi lnh trong MIPS c kch thc 32 bit (1 word 1 t nh) MIPS truy xut b nh theo nguyn tc Alignment
Restriction
Nu khng r nhnh:
PC = PC + 4 = a ch lnh k tip trong b nh
V sao cng immediate vi (PC + 4) thay v PC? Khi r nhnh b delayed 1 lnh k vi lnh r nhnh Nhn xt: immediate cho bit s lnh cn nhy qua n c nhn
V d I-format
103
Loop:
beq
add
addi j End:
opcode 4
rs 9
rt 0
immediate 3
000100
01001
00000
opcode = 4: Xc nh thao tc ca lnh beq rs = 9 (ton hng ngun th 1 l $t1 ~ $9) rt = 0 (ton hng ngun th 2 l $0 ~ $0) immediate = 3 (nhy qua 3 lnh k t lnh r nhnh c iu kin)
Vn I-format
104
Nhy trong khong 232 (4 GB) b nh I-format b hn ch gii hn vng nhy Dng J-format
Tuy nhin, d format no cng phi cn ti thiu 6 bit cho opcode nht qun lnh vi cc format khc
nhy
J-format
105
6 bits opcode
26 target address
Nhn xt
106
Trong J-format, cc lnh nhy c th nhy ti cc lnh c a ch trong khong 226 Mun nhy ti cc lnh c a ch ln hn t 227 n 232 ?
MIPS
Tuy
Bng tm tt Format
107
31
op
6 bits Opcode
25
rs
5 bits
20
rt
5 bits
15
rd
5 bits
10
sh
5 bits Shift amount
fn
6 bits Opcode extension
Source register 1
25
Source register 2
20
Destination register
15
31
op
6 bits Opcode
rs
5 bits Source or base
rt
5 bits
operand / offset
16 bits Immediate operand or address offset
Destination or data
31
op
6 bits Opcode
25
Ph lc 4: Addressing mode
108
L phng thc nh vi tr (a ch ha) cc ton hng trong kin trc MIPS C 5 phng php chnh:
$t0, $t0, 5)
Base addressing (Vd: lw $t1, 8($t0) ) Ton hng = ni dung nh (a ch nh = ni dung thanh ghi + hng s 16 bit trong cu lnh)
PC-relative addressing (Vd: beq $t0, $t1, Label) Ton hng = a ch ch lnh nhy = ni dung thanh ghi PC + hng s 16 bit trong cu lnh
Pseudodirect addressing (Vd: j 2500) Ton hng = a ch ch lnh nhy = cc bit cao thanh ghi PC + hng s 26 bit trong cu lnh
Addressing mode
109
Homework
110