MÓDULO A FERRAMENTA SID M 01 E INSTRUÇÕES DO 8086/88 OBJETIVOS • • • • Saber utilizar a ferramenta SID, seus comandos e recursos Conhecer os registradores dos microprocessadores 8086/88 Conhecer o conjunto de instruções dos microprocessadores 8086/88 Conhecer os modos de endereçamento dos microprocessadores 8086/88 PARTE I - A FERRAMENTA SID O SID é a ferramenta que será utilizada como suporte ao desenvolvimento de software dos microprocessadores 8086/88. Ele oferece comandos para carregar e executar programas, examinar registradores, posições de memória, etc. Este experimento pretende servir como introdução ao uso do SID com seus diversos comandos. A apresentação dos seus recursos será feita ao longo do curso. No entanto é necessário se familiarizar com seus conceitos básicos para que nos experimentos seguintes, o foco do trabalho passe a ser as características do microprocessador. As instruções sobre o SID estão resumidas na apostila “SID – Manual de Referência”, que deve ser adquirida pelo aluno. Lá estão descritos como entrar e sair do sistema, como acionar esse programa, e os diversos comandos disponíveis. Para responder às questões neste experimento, leia atentamente a apostila. PARTE II – OS MICROPROCESSADORES 8086/88 Em 1978, a Intel Corporation lançou pela primeira vez um microprocessador de 16 bits, o 8086, utilizando tecnologia HMOS. Este processador oferece uma série de novos recursos não disponíveis nos micros anteriores, como por exemplo, as instruções multiplicar e dividir, entre outras. A versão 8088 apresenta barramento de dados com oito linhas, sendo nos demais aspectos similar ao 8086. 1. O Conjunto de Registradores Na apostila “Assembly – Manual de Referência” você encontrará um mapa dos registradores da CPU do 8086/88. Os registradores de uso geral são usados para armazenar operandos e resultados. Podem ser usados como quatro registradores de 16 bits ou oito registradores de 8 bits. Esses registradores podem vir a desempenhar funções específicas, que serão discutidas ao longo do curso. 16 BITS AX BX CX DX 8 BITS (MSB) AH BH CH DH 8 BITS (LSB) AL BL CL DL MSB – Most Significant Byte (Byte Mais Significativo) LSB – Least Significant Byte (Byte Menos Significativo) Quando um programa é executado, o conteúdo do registrador IP (Instruction Pointer) será o endereço da próxima instrução a ser executada. A função dos demais registradores será discutida durante a apresentação do conjunto de instruções. No entanto é necessário reconhecê-los, já neste experimento, de modo a poder utilizar os comandos do SID. 2. Memória Do ponto de vista do programador, a memória se comporta como um conjunto de endereços onde é possível “escrever” e “ler” informações. Cada locação, ou endereço, é identificada por um número. Endereço Conteúdo A tabela ao lado representa um mapa de memória onde os 0000 0A endereços são de 16 bits e os conteúdos armazenados são de 8 bits. 0001 B2 Endereços e conteúdos estão representados em hexadecimal. .... .... A memória pode ser vista como uma longa lista de endereços, .... .... ou como um agrupamento de endereços em blocos denominados FFFE 7F páginas. Aqui será utilizado o conceito de página, de modo que os FFFF 3C dígitos mais significativos do endereço representam a página, e os dígitos menos significativos identificam a posição dentro da página. A página 10, por exemplo, compreenderá os endereços de 1000 a 10FF. Cabem aqui algumas observações: • • • Com 16 bits é possível endereçar 216 = 64K locações. Para aumentar essa faixa de endereços pode-se estender o tamanho de palavra de endereço, ou utilizar técnicas de gerenciamento de memória. Os microprocessadores 8086/88 utilizam o gerenciamento de memória por segmentos, que será discutido oportunamente. Os conteúdos de uma área de memória podem representar programas em linguagem de máquina, dados numéricos, texto codificado em ASCII, etc. O programador deve estar atento para evitar erros, que levem, por exemplo, a executar programas na área de dados. Em memórias, cujo dado armazenado seja de 8 bits, é possível armazenar “dados longos”, isto é, com mais de 8 bits. Neste caso o dado ocupará o número necessário de locações sucessivas de memória. Em geral, os microprocessadores da Intel, quando armazenam dados longos, armazenam primeiro o LSB e em seguida o MSB, isto é os bytes menos significativos ocupam os endereços menores. 3. A Instrução “MOV” e alguns dos Modos de Endereçamento do 8086/88 Uma instrução em assembly consiste do código da operação a ser realizada (OPCODE), seguido do operando ou da informação sobre sua localização. Considere a instrução de transferência de dados no 8086/88: MOV destino, origem O mnemônico MOV identifica a operação, e os campos, denominados origem e destino, identificam respectivamente de onde e para onde o operando é transferido. Esses campos podem localizar os operandos de diversas maneiras (modos de endereçamento). Alguns desses modos são exemplificados a seguir. Cada exemplo é apresentado para operandos de oito bits e para operandos de dezesseis bits: Endereçamento Imediato – O operando que será transferido, segue o código da operação (faz parte da instrução). Ex: MOV AL,05 MOV BX,3DF7 Endereçamento por Registrador – O operando a ser transferido, está armazenado em um registrador da CPU. Ex: MOV CH,CL MOV AX,BX Endereçamento Direto – O operando a ser transferido está armazenado na memória, no endereço fornecido na instrução. Ex: MOV BL,[0100] MOV AX,[0200] Neste último exemplo, uma vez que AX é de dezesseis bits, o conteúdo da locação [0200] será transferido para AL, e o conteúdo de [0201] para AH. 4. Programação Assembly Um programa escrito em assembly, ou programa fonte, consiste de uma seqüência de instruções na forma de mnemônicos. Programas fonte que serão testados sob o SID devem ser finalizados com a instrução INT 3 (interrupção do tipo 3). Não se deve usar a instrução HLT (parar), pois isso desativaria inclusive o SID. Para que um programa fonte possa ser executado, deve ser convertido em programa objeto, no qual cada instrução é representada por um código numérico. No 8086/88 cada instrução em linguagem de máquina (programa objeto) ocupa de um a seis bytes de comprimento, dependendo do modo de endereçamento. Como exemplo, considere o programa a seguir, representado nas formas de código fonte e de código objeto. 0100 0102 0105 0106 Programa fonte MOV AL, A5 MOV AX, [C200] INT 3 ..... 0100 0101 0102 0103 0104 0105 Programa objeto B0 A5 A1 00 C2 CC Verifique, para cada instrução no código fonte, o número de bytes que constituem o seu código objeto. Observe que a primeira instrução ocupa dois bytes, um deles com o “OPCODE” da instrução (B0), o outro com o operando (A5). A segunda instrução ocupa três bytes, o primeiro com o “OPCODE” e os dois seguintes com o endereço do operando. A última instrução consiste apenas do “OPCODE”, ocupando apenas uma posição de memória. Dependendo do modo de endereçamento, outras instruções podem utilizar dois bytes para o “OPCODE” , ou duas referências a operandos, podendo utilizar até seis bytes. O programa fonte é voltado para o programador, facilitando sua concepção e análise. Por outro lado, o programa objeto é codificado de modo a ser interpretado e executado pelo microprocessador. Em geral, o programa é editado e carregado na máquina no formato fonte (linguagem assembly), em seguida, é convertido para o formato objeto (linguagem de máquina) utilizando algum recurso de software, e só então pode ser executado. No laboratório, o SID faz a conversão de forma automática, de modo que, ao concluir o carregamento do programa fonte o programa objeto já estará na memória. Durante a concepção do programa fonte, fica difícil estabelecer o endereço de cada instrução, uma vez que este endereço depende do número de bytes que cada instrução irá ocupar. Para facilitar este trabalho, o programa tradutor-montador (assembler) necessita apenas da indicação do endereço inicial do programa, ou seja, o endereço de origem (ORG), ou mesmo da área de dados. 5. Comentários Todos os guias de experimentos do laboratório possuem uma introdução teórica, como é o caso deste. Você deve ter observado que a teoria apresentada é bastante superficial. Os guias devem ser considerados como uma orientação sobre o que você deve estudar, não como textos completos. Os conceitos vistos aqui sobre o microprocessador provavelmente já lhe foram apresentados, de forma bem mais completa, nas aulas teóricas. Consulte suas notas de aula, livros, apostilas, antes de fazer a preparação e de ir ao laboratório. Você só tem a ganhar. Quanto ao SID, não foi feita uma introdução teórica porque todas as informações que você vai necessitar estão na apostila indicada em “Referências”, sendo portanto desnecessário apresentá-las aqui. 6. Referências “SID – Manual de Referência”, FACAPE “Assembly – Manual de Referência”, do microprocessador 8086/88, Intel Co., 1978 PREPARAÇÃO 1. Qual a função do programa SID ? 2. A seguir temos um exemplo de carregamento de dados em locações sucessivas de memória, utilizando o comando S: #S0100. 0100 00 37 0101 00 #37 0102 00 'A' 0103 00 A 0104 00 "ABC 0107 00 A+’A’ 0108 00 . Após a execução deste comando, qual o conteúdo, em hexadecimal, das locações envolvidas? 3. Quais são os registradores do 8086/88 que oferecem opção de uso com 8 e 16 bits? 4. Considere o programa fonte a seguir. Este programa carrega o registrador AL com 20H (#32), e decrementa esse valor até zero. Portanto, o laço (loop) entre os endereços 1002 e 1004, é executado trinta e duas vezes. endereço instrução ação 1000 1002 1004 1006 MOV DEC JNZ INT ; carrega AL com 20 (#32) ; decrementa AL ; se AL ≠ 0, retorna para 1002 ; devolve o comando ao SID AL, 20 AL 1002 3 a. Quais os comandos (e parâmetros) do SID que devem ser usados para obter o programa objeto? b. Qual o formato do comando P para interromper a execução após o registrador AL ter sido decrementado pela décima segunda vez? Qual o conteúdo do registrador AL após a parada? 5. Escreva um programa para carregar AX, BX e CX com operandos provenientes da memória (modo de endereçamento direto). Escolha endereços para os dados (observe que os registradores são de dezesseis bits) e para o início do programa. Considere que os dados ocupam uma região contínua da memória. 6. Considerando o programa do item anterior, quais comandos (e parâmetros) devem ser usados para: a. b. c. d. e. Carregar o programa? Carregar os dados? Listar o programa? Executar o programa? Examinar os resultados? 7. Quais comandos (incluindo parâmetros) devem ser usados para: a. Preencher todas as locações de memória da página 0B com FF ? b. Examinar o resultado? c. Copiar o conteúdo da página 0B para a página 03 ? 8. Para que servem os comandos T e U, e qual a diferença entre eles? 9. Para cada instrução do programa a seguir, identifique o modo de endereçamento utilizado, a origem e o destino dos operandos: ORG 0200 0200 MOV 0203 MOV 0205 MOV 0209 INT AX, 031A BL, AH BH, [2000] 3 10.Que resultado você espera ver na tela após ser digitado o comando: a. #H0010,0005 b. #H'A' 11.Uma vez iniciada a execução de um programa através do comando G, quais as formas possíveis de suspender a execução?