O Plano de Ensino
Por: lucaswll • 24/9/2020 • Ensaio • 1.652 Palavras (7 Páginas) • 126 Visualizações
Ao desenvolver esta atividade e devolvê-la com as respostas, o estudante está ciente que ela deverá ser desenvolvida individualmente sob compromisso de honra.
Obviamente, está permitida a consulta de recursos disponibilizados no ambiente virtual e quaisquer outras que o estudante encontrar (lembre-se sempre de beber da fonte, quando possível).
Além disso, não é somente permitido, como é esperado que os estudantes troquem ideias entre si, mas sem prejuízo ao aprendizado que só é alcançado pelo esforço próprio.
Por ocasião da primeira atividade apresentada à turma, a citação abaixo será apresentada somente esta vez. Passo a vocês a responsabilidade e tenho confiança que vocês responderão à altura.
“Chamamos de ética o conjunto de coisas que as pessoas fazem quando todos estão olhando. O conjunto de coisas que as pessoas fazem quando ninguém está olhando chamamos de caráter.”
Oscar Wilde
Tarefa 1 - Pseudo-instruções (0,5) |
Coloque o código abaixo em um arquivo com extensão asm e abra no MARS.
.data
STR1:.asciiz "FIM"
.text
main:li $s0, 50
R1: ble $s0, $zero, R2
addi $s0, $s0, -1
j R1
R2: la $a0, STR1
addi $v0, $zero, 4
syscall
No código, temos as seguintes pseudo-instruções:
- li (load immediate):
- li $s0, 50 # $s0 recebe 50
- ble (branch if less or equal):
- ble $s0, $zero, R2 # desvia se o conteúdo de $s0 for menor ou igual a zero.
- la (load address):
- la $a0, STR1 # coloca o endereço (número de 32 bits) de STR1 em $a0
Explique como cada uma delas é executada usando instruções reais.
li | addiu $s0, $zero, 50 #s0 <- 50 |
ble | slt $at, $zero, $s0 |
la | lui $at, 0x1001 #bits[31:16] de &STR1 |
Tarefa 2 - Engenharia reversa (0,9) |
Engenharia reversa é uma arte.
Analise o código da tarefa 1 e escreva o equivalente em linguagem C.
Resposta:
main() {
int x = 50;
while(x > 0) {
x--;
}
printf(“FIM”);
}
Tarefa 3 - Formatos de instrução e endereçamentos (1,0) |
Localize as instruções addi e j no código.
Para cada uma delas, informe:
- formato usado (tipo R, I ou J)
- o valor de cada um seus campos
-> addi ( instrução 0x2210ffff -> 0010 0010 0001 0000 1111 1111 1111 1111 )
TIPO | OP CODE (6 bits) | RS (5 bits) | RT (5 bits) | CONSTANTE (16 bits) |
I | 8 | 16 | 16 | -1 |
-> j ( instrução 0x08100001-> 0000 1000 0001 0000 0000 0000 0000 0001 ) ->
[0000 0000 0100 0000 0000 0000 0000 0100] = 0x0040 0004
Legendas de cores:
- pseudoEndereço (26bits) <<2 (pois instruções no MIPS32 sempre terminam com os 2 bits finais =0)
- 4 bits mais altos de PC (que chega aqui valendo 0x0040000C)
TIPO | OP CODE (6 bits) | ENDEREÇO (26 bits) |
J | 2 | 0x00400004 |
Localize a instrução de desvio condicional.
Apresente o valor do último campo e explique-o.
Resposta: instrução beq = 0x10200002
Último campo 2, é o número de instruções que serão saltadas a partir de (PC+4), caso (conteúdo de $at) = 0.
Localize a instrução de salto.
Apresente o valor do último campo e como ele se relaciona com 0x00400004
Resposta: resposta acompanha a resolução acima feita para instrução j - jump
Tarefa 4 - Escovando bits com instruções lógicas (1,2) |
Em várias situações temos informações que apresentam apenas dois valores e é preferível guardar em apenas um bit e não em um byte ou palavra.
Suponha que em uma certa tecnologia de rede, um pacote deve ser marcado como “elegível para descarte” se a fila no roteador estiver acima de um certo limite. Caso contrário, o pacote não somente não será marcado, como a marcação será removida.
Assim, crie um código que coloque 1 no bit30 de do registrador $s0 se $s1<$s2 e 0 caso contrário.
$s0 | ||||||
b31 | b30 | b29 | ... | b2 | b1 | b0 |
Teste para os 4 casos:
- $s0 = 0xFFFF1234, $s1 = 100, $s2=200
- $s0 = 0x0FFF1234, $s1 = 100, $s2=200
- $s0 = 0xFFFF1234, $s1 = 200, $s2=100
- $s0 = 0x0FFF1234, $s1 = 200, $s2=100
Código: fiz para os 4 casos: basta mudar valor de $s0 de(0xffff1234 para 0x0fff1234); e alternar $s1 e $s2 entre 100 e 200.
...