Você está na página 1de 3

MINISTÉRIO DA EDUCAÇÃO

UNIVERSIDADE FEDERAL DE RORAIMA


DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO
DCC 510 – PROGRAMAÇÃO EM BAIXO NÍVEL

TRÁBALHO PRÁTICO (versão II)

1. Descrição do Trabalho

Deverá ser desenvolvido um programa em linguagem C para reconhecer e gerar o código de máquina
equivalente do Processador MIPS para todas as instruções vistas na disciplina conforme a tabela abaixo.

Instrução Formato
add R
sub R
addi I
subi I
lw I
sw I
lb I
sb I
and R
or R
andi I
ori I
sll R
slr R
beq I
bne I
slt R
slti I
j J
jr R
jal J

O programa deve ser executado via linha de comando obedecendo a seguinte sintaxe:
$>montador <arqsource> <arqhex>

Onde <arqsource> corresponde ao arquivo texto com o programa em assembly mips e <arqhex> será o
arquivo criado com o programa hexadecimal correspondente.

*IMPORTANTE: o trabalho deverá ser desenvolvido em linguagem C, assim como deverá ser criado
um makefile para compilar o programa. Somente devem ser utilizados os comandos make e make
clean no makefile.

2. Exemplos de Entrada e Saída

 Exemplo de Arquivo de Entrada (Arquivo Instruções Assembly MIPS)


addi $a0,$zero,3
fatorial: addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 1
beq $t0, $zero, L1
addi $v0, $zero, 1
Av. Cap. Ene Garcez, 2413, Bloco V, Campus do Paricarana.
Bairro Aeroporto, Boa Vista-RR, CEP: 69.304-000 - Telefone: (95) 3621-3185 / (95) 99155-5477
http://ufrr.br/campuscom/
https://www.facebook.com/dccufrr
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fatorial
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $a0, $v0
jr $ra
exit:

 Exemplo de Arquivo de Saída Correspondente (Programa em Hexadecimal)


20040003
0c10000c
0810001b
23bdfff8
afbf0004
afa40000
28880001
11000004
20020001
23bd0008
03e00008
2084ffff
0c10000c
8fa40000
8fbf0004
23bd0008
70821002
03e00008

3. Dicas sobre o endereçamento de labels

É importante observar o segmento de texto de programas Assembly MIPS nos simuladores


(SPIM). O exemplo abaixo corresponde ao segmento de texto do programa fatorial:

User Text Segment [00400000]..[00440000]


[00400000] 8fa40000 lw $4, 0($29) ; 183: lw $a0 0($sp) # argc
[00400004] 27a50004 addiu $5, $29, 4 ; 184: addiu $a1 $sp 4 #
argv
[00400008] 24a60004 addiu $6, $5, 4 ; 185: addiu $a2 $a1 4 #
envp
[0040000c] 00041080 sll $2, $4, 2 ; 186: sll $v0 $a0 2
[00400010] 00c23021 addu $6, $6, $2 ; 187: addu $a2 $a2 $v0
[00400014] 0c100009 jal 0x00400024 [main] ; 188: jal main
[00400018] 00000000 nop ; 189: nop
[0040001c] 3402000a ori $2, $0, 10 ; 191: li $v0 10
[00400020] 0000000c syscall ; 192: syscall # syscall 10
(exit)
[00400024] 20040003 addi $4, $0, 3 ; 5: add $a0,$zero,3
[00400028] 0c10000c jal 0x00400030 [fatorial]; 6: jal fatorial
[0040002c] 0810001b j 0x0040006c [exit] ; 7: j exit
[00400030] 23bdfff8 addi $29, $29, -8 ; 9: addi $sp, $sp, -8
[00400034] afbf0004 sw $31, 4($29) ; 10: sw $ra, 4($sp)
[00400038] afa40000 sw $4, 0($29) ; 11: sw $a0, 0($sp)
[0040003c] 28880001 slti $8, $4, 1 ; 12: slti $t0, $a0, 1
[00400040] 11000004 beq $8, $0, 16 [L1-0x00400040]; 13: beq $t0, $zero,
L1
[00400044] 20020001 addi $2, $0, 1 ; 14: addi $v0, $zero, 1
[00400048] 23bd0008 addi $29, $29, 8 ; 15: addi $sp, $sp, 8
Av. Cap. Ene Garcez, 2413, Bloco V, Campus do Paricarana.
Bairro Aeroporto, Boa Vista-RR, CEP: 69.304-000 - Telefone: (95) 3621-3185 / (95) 99155-5477
http://ufrr.br/campuscom/
https://www.facebook.com/dccufrr
[0040004c] 03e00008 jr $31 ; 16: jr $ra
[00400050] 2084ffff addi $4, $4, -1 ; 18: addi $a0, $a0, -1
[00400054] 0c10000c jal 0x00400030 [fatorial]; 19: jal fatorial
[00400058] 8fa40000 lw $4, 0($29) ; 20: lw $a0, 0($sp)
[0040005c] 8fbf0004 lw $31, 4($29) ; 21: lw $ra, 4($sp)
[00400060] 23bd0008 addi $29, $29, 8 ; 22: addi $sp, $sp, 8
[00400064] 70821002 mul $2, $4, $2 ; 23: mul $v0, $a0, $v0
[00400068] 03e00008 jr $31 ; 24: jr $ra

Nesse exemplo, a parte em vermelho corresponde ao trecho de código do sistema para


carregamento da função principal do programa. Esse trecho de código é recorrente para todas as
simulações. Sempre iniciando o segmento de texto do programa no endereço de memória
[00400000] e com a primeira instrução da função principal do programa no endereço [00400024].
Portanto, o cálculo do endereço de labels deve ter como endereço da primeira linha do programa o
valor [00400024], com incremento de quatro unidades por linha, correspondente aos quatro bytes
(alinhamento de memória do MIPS).

Av. Cap. Ene Garcez, 2413, Bloco V, Campus do Paricarana.


Bairro Aeroporto, Boa Vista-RR, CEP: 69.304-000 - Telefone: (95) 3621-3185 / (95) 99155-5477
http://ufrr.br/campuscom/
https://www.facebook.com/dccufrr

Você também pode gostar