Quem sou eu

Minha foto
Salvador, BA, Brazil
Analista de sistemas, expert em telecom, formado em Eng. Elétrica e nerd assumido

quarta-feira, 28 de setembro de 2011

Será que você leva jeito para programação Assembly?

Cerca de 25 anos atrás, em uma das minhas encarnações anteriores como systems programmer, meu gerente surgiu com um teste de aptidão para avaliar a competência dos candidatos ao cargo de programador na área de raciocínio lógico.

Depois eu passei a ver este teste como uma forma legal de avaliar se um determinado candidato tinha potencial pra trabalhar na área de systems programming, porque o teste tem muito a ver com programação Assembly: entender a arquitetura da máquina e saber usar as instruções de máquina.

Se você tiver curiosidade sobre sua possível habilidade para esta área da Informática, sugiro que tente fazer o teste abaixo. As regras são as seguintes:
  1. Você tem, no máximo, uma hora para fazer o teste;
  2. Todas as informações necessárias para responder às questões estão no texto;
  3. A interpretação das questões faz parte do teste.
Se você não se der bem, não se desespere. Eu mesmo, quando fiz o teste, não consegui terminar corretamente a terceira questão. E até hoje eu só encontrei uma pessoa que "gabaritou" o teste, e ele fez isso com requintes de crueldade: as duas primeiras questões ele fez de cabeça, e a terceira só precisou de um pouco de rascunho. Demorou, no total, uns 10 minutos.

Enfim, vamos ao enunciado. Depois publico o gabarito. Quem tiver um pouco de familiaridade com a teoria da computação vai reconhecer que o que vamos usar no teste é uma máquina de Turing.

Um computador hipotético é composto por:

a) Unidade de fita magnética cujos cabeçotes de leitura e gravação possuem acionamento independente (ou seja: é possível estar lendo e gravando em posições físicas diferentes da mídia montada na unidade) e, quando acionados, sempre atuam na direção progressiva de leitura/gravação da mídia;

b) Memória de tamanho infinito, com cada posição de memória sendo capaz de armazenar uma única instrução de máquina, e endereçamento das posições de memória de forma sequencial, crescente, iniciando em 0 (zero), com todos os endereços expressos em decimal;


c) CPU que sempre inicia a execução dos programas a partir da posição de memória com endereço 0 (zero) e que, com exceção dos casos previstos no instruction set, executa as instruções de máquina de forma sequencial em ordem crescente dos endereços de memória;

d) Instruction set:
d.1) Instrução A - causa a gravação de um caracter * (asterisco) na mídia montada na unidade de fita magnética;
d.2) Instrução H - causa a gravação de um caracter - (hífen) na mídia montada na unidade de fita magética;
d.3) Instrução T - causa a leitura de um caracter na mídia montada na unidade de fita magnética e: se o caracter lido for - (hífen) executa a seguir a instrução no endereço de memória x + 1; se o caracter lido for * (asterisco) executa a seguir a instrução no endereço de memória x + 2; onde x é o endereço de memória onde reside a instrução T;
d.4) Instrução n (onde n = 0,1,2,3,4,5,6,7,8 ou 9) - causa desvio incondicional para a instrução de máquina no endereço de memória n.

Para cada um dos exemplos apresentados e problemas propostos supõe-se que:

1) Existe mídia montada na unidade de fita magnética, cujo conteúdo inicial é uma sequência aleatória dos caracteres * (asterisco) e - (hífen), e tanto o cabeçote de leitura quanto o cabeçote de gravação da uidade de fita magnética estão posicionados no início físico da mídia;


2) Todas as posições da memória estão preenchidas com uma sequência aleatória de instruções de máquina válidas;


3) Não é possível codificar instruções de máquina inválidas;


4) Todos os programas par asolução dos problemas iniciam-se na posição de memória de endereço 0 (zero).


EXEMPLO:


Trocar, na mídia de fita magnética, cada caracter * (asterisco) por - (hífen), e vice-versa.

Resposta: T4H0A0



Com estas informações, elabore programas com o menor número possível de instruções de máquina que solucionem os problemas propostos.


PROBLEMAS PROPOSTOS:


P.1) Gravar, na mídia de fita magnética, o padrão de caracteres: *-**-***- ... (um asterisco, um hifen, dois asteriscos, um hífen, três asteriscos, um hífen, ...).


P.2) Trocar, na mídia de fita magnética, cada segundo caracter * (asterisco) encontrado pelo caracter - (hífen).


P.3) Localizar, na mídia de fita magnética, a primeira ocorrência do string *** (três asteriscos consecutivos) copiar, a partir do início da mídia de fita magnética, todos os caracteres que se seguem ao string localizado até encontrar a próxima ocorrência do string *** (três asteriscos consecutivos), copiando-os, inclusive, e depois parar.

Boa sorte!

Nenhum comentário:

Postar um comentário