8088 Assembly Software Básico Mitsuo Takaki Processador 8088 Versão simplificada do processador 8086. Usa registradores de 16 bits, invés de 32 bits. Criado devido ao alto custo de produção do 8086. Usado na versão original do IBM PC. Base do Pentium. Processador 8088 Possui 1mb de memória. Registradores não possuem bits suficientes para endereçar toda memória. Divide a memória em segmentos de 64kb. Seriam necessários 20 bits para endereçar toda memória. Ciclo do Processador A execução de uma única instrução segue as seguintes etapas: 1.Buscar instrução na memória no segmento de código usando PC. 2.Incrementar o PC. 3.Decodificar a instrução buscada. 4.Buscar os dados necessários na memória e/ou nos registradores do processador. 5.Executar a instrução. 6.Armazenar os resultados da instrução na memória e/ou registradores. Registradores Registradores Possui registradores do seguinte tipo: De propósito geral. De ponteiros. De flag. De segmento. Não deixa de ser um ponteiro. Registradores – Propósito Geral AX (AH, AL) É denominado registrador acumulador. Usado para coletar resultados. Alvo de muitas instruções. Geralmente é o destino implicito de instruções. Ex. instrução de multiplicação. Registradores – Propósito Geral BX (BH, BL) Conhecido como registrador de base. Pode conter endereços. AX não é capaz de armazenar endereços. MOV AX,BX O conteúdo de BX é copiado para AX. MOV AX,(BX) O conteúdo da posição de memória apontada por BX é copiado para AX. Registradores – Propósito Geral CX (CH, CL) Conhecido como registrador de contadores. É usado na contagem de loops. É automaticamente decrementado na instrução LOOP. Os loops, geralmente, são encerrados quando CX chega a zero. Registradores – Propósito Geral DX (DH, DL) Chamado de registrador de dados. Usado em conjunto com AX em instruções de comprimento de palavra dupla (32 bits). DX contém os 16 bits de ordem alta. AX contém os 16 bits de ordem baixa. Registradores - Ponteiros PC Program Counter, aponta para a próxima instrução a ser executada. Conhecido também como IP (Instruction Pointer). Sempre aponta para o segmento de código. Não é endereçado pelas instruções. Incrementado antes da instrução ser executada. Já aponta para a próxima instrução. Registradores - Ponteiros SP Conhecido como registrador de ponteiro de pilha. Aponta para o topo da pilha. Incrementado/decrementado após instruções que modificam a pilha. MOV e CALL decrementam o valor de SP. POP incrementa o valor SP. Registradores - Ponteiros BP Conhecido como registrador de base. Geralmente contém um endereço dentro do segmento de pilha. Enquanto SP armazena o topo, BP armazena o início da pilha. O quadro de pilha é delimitado por BP e SP. Registradores - Ponteiros SI Índice de fonte. DI Índice de destino. Usados em conjunto com BP. Endereça dados na pilha. Usados em conjunto com BX. Calcula os endereços de localização de dados na memória. Registradores - Flag É na verdade um conjunto de registradores de um bit. A maioria está relacionada ao resultados de instruções aritméticas. Nem todos os bits são usados. Estão ligados, eletricamente, ao valor zero. Registradores - Flag Z – Resultado é zero. S – Resultado é negativo (bit de sinal). V – Resultado gerou um excesso. C – Resultado gerou um “vai-um”. A - “vai-um” auxiliar (vai-um do bit 3). P – paridade do resultado. I – Habilita interrupção. T – Habilita modo rastreamento (depuração). D – Direção das operações de cadeia. Registradores - Segmento CS Code Segment Informa onde o segmento de código começa dentro da memória. Um novo segmento pode ser ativado com uma simples mudança do valor armazenado no registrador. Registradores - Segmento DS Data Segment Informa onde o segmento de dados começa dentro da memória. Pode ser alterado para acessar dados fora do segmento correspondente. Registradores - Segmento SS Stack Segment Informa onde o segmento de pilha começa dentro da memória. Registradores - Segmento ES Extra Segment Informa onde o segmento extra começa dentro da memória. Registradores - Segmento Geralmente não são alterados. Na prática, o segmento de dados e de pilha usam a mesma porção de memória. O segmento de dados na parte inferior. Segmento de pilha no topo. Memória Não é capaz de endereçar toda a memória. Divide a memória em segmentos. Utiliza segmentos de 64kb. Consiste de um vetor de bytes de 8 bits endereçáveis. Usada para armazenamento de instruções, dados e pilha. Memória É dividida nos seguintes segmentos: Código. Dados. Pilha. Extra. Segmento de Código Contém as instruções do programa. O conteúdo do PC é sempre interpretado como um endereço de memória no segmento de código. Um PC de valor zero, se refere ao endereço mais baixo do segmento de código. Não se refere ao endereço absoluto zero. Segmento de Dados Contém os dados do programa. Inicializados. Não-inicializados. Quando BX contém um ponteiro, aponta sempre para o segmento de dados. Segmento de Pilha Contém variáveis locais e resultados intermediários. Os endereços de SP e BP estão sempre dentro deste segmento. Composto por palavras de 2 bytes. SP deve conter número par. SP incrementa/decrementa de 2. Pilha (Stack) A pilha contém informações de contexto sobre o programa em execução. Geralmente quando um procedimento é chamado, uma parte da pilha é reservada para: Variáveis locais do procedimento. Endereço de retorno. Outras informações de controle. Pilha (Stack) A porção da pilha relativa a um procedimento é chamada de quadro de pilha. Quando um procedimento chama outro procedimento, um quadro adicional é alocado. Normalmente, logo abaixo do quadro corrente. Geralmente cresce do endereço mais alto para o mais baixo. Endereço mais baixo é chamado de topo da pilha. Segmento Extra Registrador de segmentos avulsos. Pode ser alocado em qualquer lugar da memória onde seja necessário. Memória Registradores de segmento sempre indicam múltiplos de 16, em um espaço de endereço de 20 bits. Endereços dentro do segmento pode ser convertido em endereços reais. Multiplica-se o registrador de segmento por 16 e, então, soma o deslocamento.