NOME Nº RESOLUÇÃO 2º Teste de Arquitectura de Computadores LESIM e LERCI IST - Taguspark Prof. responsável: José Delgado 2º Semestre 2002/2003 5 de Abril de 2003 Início: 10H00 FIM: 10H50 SEM consulta Tolerância: até às 11H00 Identifique todas as folhas! RESPONDA APENAS NOS RECTÂNGULOS. Se precisar de mais espaço, é porque está a responder ao que não foi pedido (se mesmo assim quiser insistir, use o verso da folha e indique CLARAMENTE esse facto) Use as caixas de “Justificação” para justificar as respostas e fazer cálculos intermédios Não é permitido qualquer outro material sobre a mesa de exame para além deste enunciado. Se precisar de folhas de rascunho, use o verso das folhas do enunciado. 1 - Considere os números 10 e –14 em decimal. a) - Represente-os em complemento para 2 com 16 bits, em hexadecimal. 10 -14 000AH FFF2H Justificação: Considerando primeiro os módulos dos números inteiros decimais dados, vamos obter a sua conversão para hexadecimal: 10 = AH ; 14 = EH o que representado em 16 bits dá: 10 = 000AH ; 14 = 000EH Para representar os números inteiros com sinal, recorre-se à representação em complemento para 2. No caso do nº positivo, ela é igual à do nº sem sinal (embora o ultimo bit seja agora o sinal – 0 visto que é positivo). No caso do nº negativo, temos de obter o seu complemento p/2, ficando o bit mais significativo automaticamente a 1 – visto que é negativo: -14 = compl/2 (000EH) = FFF2H 1 NOME Nº b) - Supondo que esses números estão nos registos R1 e R2, respectivamente, indique qual o resultado, em hexadecimal (16 bits), de cada uma das instruções seguintes consideradas independentemente (não em sequência) i) NEG R2 ; R2 ← - R2 R2=000EH ii) ADD R1, R2 ; R1 ← R1 + R2 R1=FFFCH iii) AND R1, R2 ; R1 ← R1 ∧ R2 R1=0002H iv) OR R1, R2 ; R1 ← R1 ∨ R2 R1=FFFAH Justificação: i) Comp/2(R2) = Comp/2 (FFF2H) = 000EH ii) R1 = R1 + R2 ; 000AH + FFF2H = FFFCH ; iii) R1 = R1 ^R2; 000AH ^ FFF2H = 0002H R1 = -4 Apenas calculando para o nibble menos significativo visto que os bits mais significativos do resultado serao sempre 0: 1010 0010 0010 iv) R1 = R1 v R2; 000AH ^ FFF2H = FFFAH Apenas calculando para o nibble menos significativo visto que os bits mais significativos do resultado serao sempre 1: 1010 0010 1010 2 NOME Nº 2 - Suponha que a instrução XCH R1, R2 troca o conteúdo dos registos R1 e R2. Considere agora que não tem essa instrução ao seu dispôr. Mostre como implementar a mesma funcionalidade com várias instruções assembly, com recurso: a) - a um outro registo, temporário; MOV R3, R1 ; Salva conteúdo de R1 em R3 MOV R1, R2 ; Troca conteúdos MOV R2, R3 ; copiando R2 para R1 e R3 para R2 b) - à pilha. PUSH R1 ; Salva R1 na pilha PUSH R2 ; Salva R2 na pilha POP R1 ; Restaura R1 com conteúdo de R2 POP R2 ; Restaura R2 com conteúdo de R1 3 - Considere o seguinte programa em C: int [100] a; int i; i = 1; while (i != 100) { a[i] = a[i] + a[i – 1]; i++; } Considere ainda, para servir de ajuda, as instruções em assembly (com o respectivo significado em RTL) e os modos de endereçamento das tabelas seguintes: 3 NOME Nº Instruções MOV SHR NEG AND JMP.Z JMP.NZ JMP INC CMP PUSH op1, op2 op, n op op1, op2 op op op op op1, op2 op ; op1 ← op2 ; op ← op >> n ; op ← -op ; op1 ← op1 ∧ op2 ; Z: PC ← op ; NZ: PC ← op ; PC ← op ; op ← op + 1 ; Z ← (op1 - op2) = 0 ; SP ← SP + 1; M[SP] ← op Modos de endereçamento (W e i são especificados nas instruções) Nome Operando está em Imediato W Registo R[i] Directo M[W] Indirecto M[M[W]] Indirecto por registo Indexado Baseado Baseado com deslocamento M[R[i]] M[R[i]+W] M[R[i]+ R[j]] M[R[i]+ R[j]+W] Usando as instruções assembly que achar conveniente, converta as instruções de C (as declarações das variáveis não) para assembly em cada uma das alíneas seguintes, assumindo que a variável i está localizada no registo R1 e o vector a está localizado a partir do endereço indicado para cada um dos casos. Utilize os modos de endereçamento e os registos temporários que entender. a) - O vector a está localizado a partir do endereço 1000H ; Usando endereçamento indexado LOOP: MOV R1, 1 ; Inicializa i a 1 CMP R1, 64H ; Verifica se I chegou a 100 (64H) JMP.Z FIM ; e se sim acaba MOV R2, M[R1 + FFFH] ; Modo indexado para aceder a a[i-1] ADD M[R1 + 1000H], R2 ; a[i] = a[i] + a[i-1] INC R1 ; i++ JMP LOOP FIM: ; end while … b) - O vector a está localizado a partir do endereço indicado pelo registo R5. Indique apenas as diferenças em relação ao caso anterior. ; Usando endereçamento baseado c/ deslocamento e baseado, respectivamente, ; as diferenças ocorrem nas seguintes instruções MOV R2, M[R5+R1-1] ; Modo indexado para aceder a a[i-1] ADD M[R5+R1], R2 ; a[i] = a[i] + a[i-1] 4 NOME 4 - Nº Considere o programa indicado na tabela seguinte. a) - Para cada uma das instruções indique qual o nome do modo de endereçamento usado e descreva-o sucintamente. Nº Nome do modo de endereçamento imediato Instrução 1 2 3 4 5 MOV R1, 1 ADD R1, M[1000H] directo PUSH R1 registo ADD R2, M[R1+5] INC Descrição sucinta O operando está na própria instrução A instrução especifica DIRECTAMENTE o operando O operando está no registo definido na instrução O endereço do operando obtém-se somando o conteúdo de um registo com um índice especificados na instrução A instrução especifica um registo que contém o endereço do operando indexado Indirecto p/ registo M[R2] b) - Assumindo que os valores iniciais dos registos relevantes são os referidos e que todas as palavras de memória estão inicializadas com o valor do byte de menor peso do respectivo endereço (exemplos: M[1234H] = 34H, M[A3FCH] = FCH), indique quais os valores (em hexadecimal) desses registos após cada instrução. Nº Instrução Valores iniciais R1 1000H R2 2000H SP 3000H 1 MOV R1, 1 0001H 2000H 3000H 2 ADD R1, M[1000H] 0001H 2000H 3000H 3 PUSH R1 0001H 2000H 3001H 4 ADD R2, M[R1+5] 0001H 2006H 3001H 5 INC 0001H 2006H 3001H M[R2] Cotação: 1 a)b)2 a)b)3 a)b)4 a)b)- 1 valor 2 valores 3 valores 3 valores 3 valores 2 valores 3 valores 3 valores 5