arquitetura de computadores - fcupricroc/aulas/1718/ac/praticas/mips.pdf · mips –codificação...
TRANSCRIPT
ArquiteturadeComputadores
MIPS
Arquiteturadevon Neumann
CPU Memory Input/Output
SystemBUS
Control bus
Address bus
Databus
Arquiteturadevon Neumann
CPU Memory Input/Output
SystemBUS
Control bus
Address bus
Databus
Working copydoprograma
Executaasinstruçõesdoprograma
Arquiteturadevon Neumann
CPU Memory Input/Output
SystemBUS
Control bus
Address bus
Databus
Modificadadosdoprograma;lê/escreverinput/output
Working copydoprograma
Executaasinstruçõesdoprograma
Arquiteturadevon Neumann
CPU Memory Input/Output
SystemBUS
Control bus
Address bus
Databus
Modificadadosdoprograma;lê/escreverinput/output
Narealidadeexecutasobreumacópiadoprograma
Working copydoprograma
Executaasinstruçõesdoprograma
CPU
Main Memory
SystemClock
Control Unit
ALU
Registers Output
Input
CPU
Main Memory
SystemClock
Control Unit
ALU
Registers Output
Input
Mantêmumacópiadosdados
programa
Efetuacálculossobreosdadosdosregistos
Controlaaexecuçãodoprograma
ISA– Instruction SetArchitecture
• Interfaceentreohardwareeosoftware• Linguagemmáquina• Defineasregrasparacodificareinterpretarinstruçõesmáquina
• ISAdefine• Instruções• Regrasdeendereçamento• Tiposdedados• Registos• Arquiteturadamemória• Interrupt &exception handling• External I/O
MIPS
• Processadorde32bits• 32registosde32bits• Versõesmaisrecentesde64bits
• ArquiteturaRISC• Reduced instruction setcomputer
• Cache• 32kbdadose63kbdeinstruções
MIPS– RegistosNome Número U)lização$zero $0 Constante0$at $1 Reservadoaoassembler
$v0..$v1 $2..$3 Resultadodeumafunção/procedimento
$a0..$a3 $4..$7 Argumentos1,2,3e4
$t0..$t7 $8..$15 Temporários(nãopreservadosentrechamadas)
$s0..$s7 $16..$23 Persistentes(preservadosentrechamadas)
$t8..$t9 $24..$25 Temporários(nãopreservadosentrechamadas)
$k0..$k1 $26..$27 ReservadosaokerneldoS.O.
$gp $28 Ponteiroparaaáreaglobal(dadosestáticos)
$sp $29 Ponteiro dastack$fp $30 Ponteirodaframe
$ra $31 Enderecoderetorno(usadopelachamadadeumafunção)
MIPS– Tipos dedados
• .word– 4bytes(32bits)
• .half– (half-word)2bytes(16bits)
• .byte– 1byte(8bits)
• .char– 1byte(8bits)
MIPS– Endereçamento
• Endereçosde32bits(4bytes)• Little endian• Bitmenossignificativoestánoendereçodobytemenor
• Endereçamentoaobyte• Tamanhomáximodeumprograma:(232 – 1)bytes
3 2 1 0
F E D C
B A 9 8
7 6 5 4
3 2 1 00x10010000
0x10010004
0x10010008
0x1001000c
0x10010010
32bits(4bytes)1byte
Porquê?
MIPS– Regrasdeendereçamento
• word – temqueocuparumalinhadememória• Temqueterendereçomúltiplode4
• half-word – ocupaos2primeiros/últimosbytes• Temqueterendereçopar
• byte– ocupao1ºbytelivre
3 2 1 0
F E D C
B A 9 8
7 6 5 4
3 2 1 00x10010000
0x10010004
0x10010008
0x1001000c
0x10010010
word – endereço0x10010000
half – endereço0x10010008
byte– endereço0x10010010
MIPS– Memória
Reserved
.text
.data(staticdata)
Heap(dynamicdata)
Stack
0x00000000
0x00040000
0x10000000
0x7FFFFFFF32bits(4bytes)
Program structure
#this is acomment.data
A:.word 10B:.byte20C:.half 30
.textmain:lw $s0,Alh $s1,Badd $s2,$s0,$s1
Definiçãodosegmentodedados(dadosestáticosdoprograma)
Definiçãodosegmentodetexto(instruçõesdoprograma)
Labels
Programstructure
#thisisacomment.data
A:.word10B:.byte20C:.half30
.textmain:lw $s0,Alh $s1,Badd$s2,$s0,$s1
Reserved
.text
.data
Heap(dynamicdata)
Stack
0x00000000
0x00040000
0x10000000
0x7FFFFFFF
add$s2,$s0,$s1lh $s1,Blw $s0,A
C:.half30B:.byte20A:.word10
Instruções
• Load(l?)/Store(s?)lw registo_destino,endereço_memórialh registo_destino,endereço_memórialb registo_destino,endereço_memória
sw registo_origem,endereço_memóriash registo_origem,endereço_memóriasb registo_origem,endereço_memória
Instruções
• Aritméticaadd$s0,$s1,$s2##$s0=$s1+$s2sub$s0,$s1,$s2##$s0=$s1- $s2…
• Controlo (branchesejumps)bgt $s0,$s1,target##branchtotarget if$s0>$s1blt $s0,$s1,target##branchtotarget if$s0<$s1beq $s0,$s1,target##branchtotarget if$s0=$s1bne $s0,$s1,target##branchtotarget if$s0!=$s1…
Program structure
• Tantoosdadoscomoasinstruções(programas)sãomantidasemmemória
• Dadospodemtertamanhosdiferentes(byte;half;word)
• Todasasinstruçõessãocodificadasem4bytes(1word)
Reserved
.text
.data
Heap(dynamic data)
Stack
0x00000000
0x00040000
0x10000000
0x7FFFFFFF
add $s2,$s0,$s1lh $s1,Blw $s0,A
C:.half 30B:.byte20A:.word 10
Codificação deinstruções
• Trabalhoproduzidopeloassembler• Umadasfasesdacompilação• Compilarumprograma,transformarprogramaA->B
• Pré-processamento• Incluisubstituiçãodemacros,remoçãodecomentários,
• Processamento(oucompilação)• Traduçãodocódigofonteemcódigoassembly
• Paraaarquitectura deCPUcorrespondente(x86,x86_64,mips,arm64,powerpc,etc)
• Assembler• Traduçãodocódigoassembly emcódigomáquina
• Linker• Rearranjodocódigodeformaaincluircódigonãofornecido(ex:funçõesexternas)
MIPS– Codificação deinstruções
• Todasasinstruçõestêmomesmotamanho• 1word — 4bytes— 32bits
• ISAdefine3formatosdeinstruções• R-Type (register)• I-Type (immediate)• J-Type (jump)
• Todososformatosãoconsistente• opcode ocupasempreosmesmosbits
MIPS– Codificaçãodeinstruções
• R-type instructions (register instructions)
• opcode – códigodaoperação• rd – destination register• rs – source register• rt – source/destination register (transient)• shamt – used forshift operations• func – used forspecial functions
opcode rs rt rd shamt func6bits 5bits 5bits 5bits 5bits 6bits
MIPS– Codificaçãodeinstruções
• R-type instructions (register instructions)
• opcode – códigodaoperação• rd – destination register• rs – source register• rt – source/destination register (transient)• shamt – used forshift operations• func – used forspecial functions
opcode rs rt rd shamt func6bits 5bits 5bits 5bits 5bits 6bits
Porquê5bits Porquê5bits
Porquê5bits
MIPS– Codificaçãodeinstruções
• R-type instructions (register instructions)
• FormatoXXXrd,rt,rs
opcode rs rt rd shamt func6bits 5bits 5bits 5bits 5bits 6bits
MIPS– Codificaçãodeinstruções
• I-type instructions (immediate instructions)
• rs – source register• rt – source/destination register (transient)• immed – 16bitimmediate value
• FormatoXXXi rt,rs,immed
opcode rs rt immed6bits 5bits 5bits 16bits
MIPS– Codificaçãodeinstruções
• J-type instructions (Jump intructions)
• addr – address
• Formatoj? addr
opcode addr6bits 26bits
MIPS– Codificaçãodeinstruções
• opcode permitediferenciarasinstruções• VeranexoAdolivro(ouwiki)
opcode
MIPS– Codificaçãodeinstruções
• opcode permitediferenciarasinstruções• VeranexoAdolivro(ouwiki)
Mnemonic Meaning Type Opcode Funct
add Add R 0x00 0x20
addi AddImmediate I 0x08 NA
addiu AddUnsignedImmediate I 0x09 NA
addu AddUnsigned R 0x00 0x21
and BitwiseAND R 0x00 0x24
andi BitwiseANDImmediate I 0x0C NA
beq BranchifEqual I 0x04 NA
bne BranchifNotEqual I 0x05 NA
div Divide R 0x00 0x1A
divu UnsignedDivide R 0x00 0x1B
j JumptoAddress J 0x02 NA
… … … … …
MIPS– Codificaçãodeinstruções
• Exemplo: add$s0,$s1,$s2• opcode->0x00–>0000002• funct ->0x20–>1000002• $s0–>$16–>100002• $s1–>$17–>100012• $s2–>$18–>100102
000000100011001010000000001000002ou 0x02328020
Mnemonic Meaning Type Opcode Funct
add Add R 0x00 0x20
addi AddImmediate I 0x08 NA
addiu AddUnsignedImmediate I 0x09 NA
addu AddUnsigned R 0x00 0x21
Nome Número$zero $0$at $1$v0..$v1 $2..$3$a0..$a3 $4..$7$t0..$t7 $8..$15$s0..$s7 $16..$23$t8..$t9 $24..$25$k0..$k1 $26..$27$gp $28$sp $29$fp $30$ra $31
Registos
Machine,Assembly,andCCode
• 000100001000010100000000000001110000000010100100000100000010101000010100010000000000000000000011000000001010010000101000001000110000010000000001111111111111110000000000100001010010000000100011000001000000000111111111111110100000000000000100000100000010000100000011111000000000000000001000
Machine,Assembly,andCCode
• 000100001000010100000000000001110000000010100100000100000010101000010100010000000000000000000011000000001010010000101000001000110000010000000001111111111111110000000000100001010010000000100011000001000000000111111111111110100000000000000100000100000010000100000011111000000000000000001000
beq $4,$5,28slt $2,$5,$4bne $2,$0,12subu $5,$5,$4bgez $0-16subu $4,$4,$5bgez $0-24addu $2,$0,$4jr $31
Machine,Assembly,andCCode
• 000100001000010100000000000001110000000010100100000100000010101000010100010000000000000000000011000000001010010000101000001000110000010000000001111111111111110000000000100001010010000000100011000001000000000111111111111110100000000000000100000100000010000100000011111000000000000000001000
gcd:beq $a0,$a1,.L2slt $v0,$a1,$a0bne $v0,$zero,.L1subu $a1,$a1,$a0bgcd.L1:subu $a0,$a0,$a1bgcd.L2:move$v0,$a0j$ra
beq $4,$5,28slt $2,$5,$4bne $2,$0,12subu $5,$5,$4bgez $0-16subu $4,$4,$5bgez $0-24addu $2,$0,$4jr $31
Machine,Assembly,andCCode
• 000100001000010100000000000001110000000010100100000100000010101000010100010000000000000000000011000000001010010000101000001000110000010000000001111111111111110000000000100001010010000000100011000001000000000111111111111110100000000000000100000100000010000100000011111000000000000000001000
gcd:beq $a0,$a1,.L2slt $v0,$a1,$a0bne $v0,$zero,.L1subu $a1,$a1,$a0bgcd.L1:subu $a0,$a0,$a1bgcd.L2:move$v0,$a0j$ra
beq $4,$5,28slt $2,$5,$4bne $2,$0,12subu $5,$5,$4bgez $0-16subu $4,$4,$5bgez $0-24addu $2,$0,$4jr $31
int gcd (int a,int b){while(a!=b){if(a>b)a=a- b;
elseb=b- a;
}returna;
}
MIPS– Intruções
• Load
l*$reg,addresslb –>loadbytelh –>loadhalf-wordlw –>loadwordla–>loadaddressli–>loadimmediate
MIPS– Intruções
• Load(exemplo) .dataA:.word10B:.byte30C:.half40.text
main:lw $s0,A#s0=valordeAlb $s1,B#s1=valordeBlh $s2,C #s2=valordecli$s3,25#s3=25la$s4,A#s4=endereço deA
MIPS– Intruções
• Store
s*$reg,addresssb –>storebytesh –>storehalf-wordsw –>storeword
MIPS– Intruções
• Store(exemplo) .dataA:.word0B:.byte0C:.half0.text
main:li$s0,15sw $s0,A#A=valordes0sb $s0,B#B=valordes0sh $s0,C #C=valordes0
MIPS– Intruções
• Aritméticaadd$reg,$reg,$reg ->add$s0,$s1,$s2#s0=s1+s2addi $reg,$reg,value->addi $s0,$s1,20#s0=s1+20…sub$reg,$reg,$reg ->sub$s0,$s1,$s2#s0=s1-s2…mult $reg,$reg ->mult $s0,$s1#(hi,lo)=s0*s1div$reg,$reg ->div$s0,$s1#his0%s1,lo=s0/s1
MIPS– Intruções
• Controlob**$reg1,$reg2,address
bgt $reg1,$reg2,addr #jump toaddr if reg1>reg2bge $reg1,$reg2,addr #jump toaddr if reg1>=reg2blt $reg1,$reg2,addr #jump toaddr if reg1<reg2ble $reg1,$reg2,addr #jump toaddr if reg1<=reg2beq $reg1,$reg2,addr #jump toaddr if reg1==reg2bne $reg1,$reg2,addr #jump toaddr if reg1!=reg2
MIPS– BrancheseJumps
• Permitem definir estruturas decontrolo eciclosExemplo:
if(x<0)x=0
elsey+=x
.data
.textmain:…
blt $s0,$zero,LTadd $s1,$s1,$s0jEND
LT:li$s0,0END:....
MIPS– BrancheseJumps
• Permitem definir estruturas decontrolo eciclosExemplo:
while(x<0)x+=1
.data
.textmain:…INIT:bge $s0,$zero,END
addi $s0,$s0,1jINIT
END:....
MIPS– Arrays
• Array ->coleçãodevaloresdomesmotipoacedidosporindexação• Mantidosemmemóriaemposiçõescontiguas
Exemplos:.data
A:.word10,20,30,40,50B:.word5:10C:.space40.text
main:…
MIPS– Arrays
Exemplos: .dataA:.word10,20,30,40,50B:.word5:10C:.space40.text
main:…
MIPS– ArrayseCiclos
Exemplo 1:
.dataA:.word10,20,30,40,50B:.word0
.textmain:la$s0,A
li$s1,0li$s2,0
init: bge $s1,5,endadd$t2,$s1,$s1add$t2,$t2,$t2add$t2,$s0,$t2lw $s3,0($t2)add$s2,$s2,$s3addi $s1,$s1,1jinit
end: sw $s2,B
int x=[10,20,30,40,50];int i,sum=0;for(i =0;i <5;i++){
sum+=x[i];}
MIPS– ArrayseCiclos
Exemplo 1:.data
A:.word10,20,30,40,50B:.word0
.textmain:la$s0,A
addi $s1,$s0,20li$s2,0
init: bge $s0,$s1,endlw $s3,0($s0)add$s2,$s2,$s3addi $s0,$s0,4jinit
end: sw $s2,B
int x=[10,20,30,40,50];int i,sum=0;for(i =0;i <5;i++){
sum+=x[i];}
MIPS– ArrayseCiclos
Exemplo 2:.data
A:.word10,20,30,40,50B:.word0
.textmain:la$s0,A
addi $s1,$s0,20li$s2,0
init: bge $s0,$s1,endlw $s3,0($s0)addi $s3,$s3,1sw $s3,0($s0)addi $s0,$s0,4jinit
end: sw $s2,B
int x=[10,20,30,40,50];int i,sum=0;for(i =0;i <5;i++){
x[i]+=1;}
MIPS– Syscalls
• Chamadas ao sistema permitem interagir comosistema• Ler doinput• Escrever p/output• Terminar oprograma• …
• Ocontextodaexecuçãodoprogramamuda• Aexecuçãodoprogramasócontinuaapósaexecuçãodachamada
MIPS– Syscalls
• SãodefinidaspelocódigodaoperaçãoService Codein$v0 Arguments Result
printinteger 1 $a0=integertoprintprintfloat 2 $f12=floattoprintprintdouble 3 $f12=doubletoprint
printstring 4 $a0=addressofnull-terminatedstringtoprint
readinteger 5 $v0containsintegerreadreadfloat 6 $f0containsfloatreadreaddouble 7 $f0containsdoubleread
readstring 8$a0=addressofinputbuffer$a1=maximumnumberofcharacterstoread
exit 10
MIPS– Syscalls
Exemplo:.data
txt: .asciiz “newxvalue:“.text
main:li$v0,5syscallmove$s0,$v0addi $s0,$s0,1li$v0,4la$a0,txtsyscallli$v0,1move$a0,$s0syscall
int x;scanf(“%d”,&x);x +=1;printf(“newxvalue:%d”,x);
Funções
Funções
• Funçõespermitemcriarabstrações,bemcomoreutilizarcódigo• Aassinaturadafunçãoabstraiasuautilizaçãodosdetalhesdeimplementação
• Omesmocódigopodeserusadoemdiferenteszonasdoprograma(semprequeafunçãoéchamada)
• Quandoumafunçãoéchamada• Osseusargumentossãoavaliadosepassadosavalores• Ofluxodeexecuçãodoprogramapassaparaocorpodafunção
• Quandooresultadoéobtido,ofluxodeexecuçãodoprogramaretornaparaoendereçoapósachamadadafunção
Funções
• Asfunçõestêmoseupróprioespaçodememória• Variáveislocaisnãosãovisíveisdoexterior,evice-versa• Mesmoquandofunçõessechamamaelaspróprias(recursividade)
int max(int[]array,int n){int i,max=array[0];for(i =1;i <n;i ++){
if(array[i]>max)max=array[i];
}returnmax;
}
MIPS– Funções
• Noentantoháumnºlimitadoderegistosdoprocessador• Comoéquesegarantequeumafunçãonãoalteravaloresderegistosutilizadosforadafunção?
MIPS– Funções (stack)
• Stack – Segmentodememóriausadocomopilhadedados(comportamentoLIFO)• Permiteempilhar(push)edesempilhar(pop)dados
• Stack crescenosentidodosendereçosmenores• Temcomobaseo“maior”endereçodopograma
• Permiteguardarvaloresdosregistos,paraquepossamserreutilizados,semcomprometeraexecuçãodoprograma
MIPS– Funções (stack)
• ISAdoMIPSnãoofereceoperaçõesdepush epop• Maspermitemanipularoregistostack pointer ($sp)
• $sp mantêmoendereçoatualdotopodastack• Oendereçodotopodapilhadiminui aofazerpush eaumenta quandosefazpop
MIPS– Funções (stack)
0x7FFFFFFFStack
$sp
0x7FFFFFFFStack
$sp
0x7FFFFFFFStack
$sp
Push($sp =$sp – 12)
Pop($sp =$sp +12)
0x10010000 0x10010000 0x10010000
MIPS– Funções (stack)
• Push ->permiteempilhardadosnastack• Guardarvaloresdosregistospréchamadasafunções
• Pop->permitedesempilhardadosnastack• Restaurarvaloresdosregistosapóschamadasafunções
pop: lw $s0,0($sp)lw $s1,4($sp)addi $sp,$sp,8
push:addi $sp,$sp,-8sw $s0,0($sp)sw $s1,4($sp)
MIPS– Funções (chamada)
• Caller deve passar os argumentos utilizando osregistos $a0… $a3• Caller chamaafunçãousandoainstruçãojal• Realizaosaltoeguardaem$ra oendereçoderetorno(valorde$pc antesdosalto)
• Callee calculaoresultadoeguarda-onosregistos$v0e$v1• Callee retornaaexecuçãoparaoCaller usandoainstruçãojr
MIPS– Funções (chamada)
• Caller éresponsávelporguardarovalordosregistos$t0..$t9• Convenção
• Callee éresponsávelporguardarovalordosregistos$s0..$s7• Convenção
• Caller deveguardarovalordo$ra edos$a0..$a3• Casoeleprópriotenhaquechamaroutrasfunções
MIPS– Funções (exemplo)
int max(int[]array,int n){int i,max=array[0];for(i =1;i <n;i ++){if(array[i]>max)max=array[i];
}returnmax;
}
int main(){int max,x=[10,20,30,40,50];max=max(x,5);printf(“max:%d”,max);
}
.dataX:.word10,50,30,40,20Y:.asciiz "max:”
.textmain: la$a0,X
li$a1,5jal maxmove$s0,$v0li$v0,4la$a0,Ysyscallmove$a0,$s0li$v0,1syscallli$v0,10syscall
max: addi $sp,$sp,-12sw $s0,8($sp)sw $s1,4($sp)sw $s2,0($sp)lw $s0,($a0)li$s1,1
loop: addi $a0,$a0,4bge $s1,$a1,endlw $s2,($a0)blt $s2,$s0,contmove$s0,$s2
cont: addi $s1,$s1,1jloop
end: move$v0,$s0lw $s0,8($sp)lw $s1,4($sp)lw $s2,0($sp)addi $sp,$sp,12jr $ra
MIPS– Funções (exemplo)
int fact(int x) {if (x == 1)return 1;
elsereturn x * fact(x-1);
}
int main() {int x = fact(5);printf("%d", x);
}
.data
.textmain:
li$a0,5jal factmove$a0,$v0li$v0,1syscallli$v0,10syscall
fact:add$sp,$sp,-8sw $a0,4($sp)sw $ra,0($sp)bne $a0,1,contaddi $v0,$zero,1add$sp,$sp,8jr $ra
cont:sub$a0,$a0,1jal factlw $a0,4($sp)lw $ra,0($sp)addi $sp,$sp,8mul $v0,$v0,$a0jr $ra