José Augusto Fabri Assembly Básico Aritmética em Modo Hexadecimal • Operações da adição e subtração em hexadecimal (comando H) Aritmética em Modo Hexadecimal • Número negativos: Que número representa o FFFF? Cálculo em Códigos de Máquina • O comando register - r Registradores de propósito geral – 16 bits Acesso a parte alta e a parte baixa, por exemplo AH ou AL Registradores de segmentos DS – área de memória que está sendo utilizada Ponteiros: IP = PC FLAGS, por exemplo overflow Parênteses - Segmentação de Memória 216 segmentos 0000-0000 . 216endereços . 0000-FFFF . . . . FFFF-0000 . . Qual o tamanho memória? FFFF-FFFF Cálculo em Códigos de Máquina • Somando valores Endereços de memória Código instrução de adição (utilização: 0000 0001 1100 1000) Segmento de memória utilizado Cálculo em Códigos de Máquina • Como adicionar: Operação: Opcode 00d8 01d8 02d8 03d8 adição Registradores gerais AL, BL AX,BX BL,AL BX,AX operação AL = AL + BL AX = AX + BX BL = BL + AL BX = BX + AX • Utilizando o debug, desenvolva um programa que efetue todos os cálculos a partir do endereço 0100 de memória. Cálculo em Códigos de Máquina • Correção do exercício (1) Cálculo em Códigos de Máquina • Correção do exercício (2) Cálculo em Códigos de Máquina • Como subtrair: Operação: Opcode 28d8 29d8 2ad8 2bd8 adição Registradores gerais AL, BL AX,BX BL,AL BX,AX operação AL = AL - BL AX = AX - BX BL = BL - AL BX = BX - AX • Utilizando o debug, desenvolva um programa que efetue todos os cálculos a partir do endereço 0100 de memória. Cálculo em Códigos de Máquina • Correção do exercício (1) Barra de espaço Cálculo em Códigos de Máquina • Correção do Exercício (2) Cálculo em Códigos de Máquina • Como multiplicar: Código da multiplicação Multiplica AX por BX e armazena o resultado em AX Cálculo em Códigos de Máquina • No exemplo anterior, multiplicados poucos bits. • Se multiplicarmos um número de 16 bits por outro número de 16 bits, poderemos ter como resultado um número de 32 bits. – Veja o exemplo com a multiplicação de 2 números com 2 bits cada: – 11 * 11 = 1001. • Implicação: Não temos um registrador de 32 bits para armazenar o valor do resultado. E agora? • Veja só o problema proposto: Cálculo em Códigos de Máquina 32060 7d3c00 256 ? AX armazena os 16 bits menos significativos DX armazena os 16 bits mais significativos Cálculo em Códigos de Máquina • Desenvolva a multiplicação com base nos opcodes: Operação Opcode F6E3 F7E3 Multiplicação Registradores Gerais BL BX operação AX = AL * BL DX:AX = AX*BX Cálculo em Códigos de Máquina • Divisão Operação Opcode F6F3 F7F3 Divisão Registradores Gerais BL BX operação AX = AL / BL DX:AX = AX/BX • Faça um exemplo utilizando tais conceitos. AL = quociente AH = resto AX = quociente DX = resto Apresentação de Dados • • Utilização do conceito de interrupção. int 21: interrupção utilizada para exibição de um caractere no vídeo. AH = 02 - Indica ao SO que algo será apresentado na tela. Se AH tivesse outro valor, o SO executaria outro valor. Valor ASCII do caractere @ - DL = 40 Concluí-se então que a parte mais significativa de AX, quando possui o valor 02 exibe o caractere ASCII, armazenado na parte menos significativa de DX. Código de máquina para interrupção 21 Questão – Por que não utilizar todos os bits do registrador DX para apresentação dos caracteres? – tb. ascii Apresentação de Dados Observe que utilizamos o comando g, ao invés de t. O comando T executa o programa linha a linha, e isto gera uma execução inconveniente, pois aos ser executada a int 21, é necessário executar uma sub-rotina interna na qual dará muito trabalho. O comando g age de forma direta, porém ele necessita ser informado até que ponto do deslocamento ele deve caminhar, em nosso caso 0102 Apresentação de Dados • A interrupção 20 (int 20) – objetivo: retornar do controle do computador para o sistema operacional (ou seja o encerramento do programa). • Caso um programa não possua a interrupção int 20 o mesmo pode ficar em estado de bloqueado, eternamente, pois para aquele processo o SO não recebeu o comando de volta. Continuando o programa – entrando com a instrução int 20 ? Apresentação de Dados • Apresentação do comando U • Faça um programa para imprimir os seguintes caracteres: F E M A Apresentação de Dados • O comando mov DESCUBRA O CÓDIGO HEXA DO COMANDO MOV Apresentação de Dados • Gravando programa Programa: O ele faz mesmo? Tamanho do programa (bytes) = endereço final – endereço inicial Armazenando o tamanho do programa no registrador CX. BX será utilizado se CX ultrapassar o valor de 216 Avisando o shell sobre o nome do programa – w gravando Apresentação de Dados • Abrindo programa Apresentação de Dados • Programa para imprimir na tela a string alo mundo! ‘ Posicionado as informações na memória a partir do endereço 0200 Caracteres ASCII, referentes a sting “alo mundo” AX = 0900, informa ao SO que será impresso uma seqüência de caracteres, a partir do endereço, armazenado em DX Termina a String Apresentação de Dados • Veja só o que o comando D (dump) faz: Fim da mensagem É possível gerar um arquivo .com a partir deste programa? Apresentação de Dados • Salvando o programa “alô mundo”. Início do programa: Transparência 25 Desenvolva um programa em asm que escreva o seu primeiro nome na tela Apresentação de Dados • O flag carry (CY e NC) 10000 Estouro da capacidade máxima da representação numérica 1111 1111 1111 1111 + 0000 0000 0000 0001 Apresentação de Dados • Uma nova adição, sobreposta a anterior, gerou NC para o carry. Apresentação de Dados • Apresentando valores em binário: – Comando RCL (Rotação, por meio do carry, para esquerda. – – – – – – Exemplo BX = 00AA tal que BL = AA. Em binário: BX = 0000 0000 1010 1010 BL = 1010 1010 RCL BL, 1 • Rotação para a esquerda • Soma 1 em BL (quando não estoura flag CY) Apresentação de Dados CONTINUANDO Valor inicial de BX: 00AA (ou apenas AAh) Ação IP Execução Carry 1 r IP t 0100 2 r IP t 0100 3 r IP t 0100 4 r IP t 0100 5 r IP t 0100 6 r IP t 0100 7 r IP t 0100 8 r IP t 0100 Flag CY Anotação 1 (BX)BL 0054 NC 0 00A9 CY 1 0052 NC 0 00A5 CY 1 004A NC 0 0095 CY 1 002A NC 0 0055 Apresentação de Dados Veja o exemplo ilustrativo 1 10 101 1010 10101010 01010100 10101000 + 1 = 10101001 01010010 10100100 + 1 = 10100101 54 Carry não estoura, com isto realiza soma A9 52 Carry não estoura com isto realiza soma A5 Apresentação de Dados • Desenvolvendo o mesmo programa com um loop: Contador armazenado em CX – o loop decrementa-o, automaticamente Apresentação de Dados • Executando: Apresentação de Dados • Executando E assim por diante – até zerar CX Apresentação de Dados • Um versão um pouco melhor do mesmo programa: Informa o SO para imprimir um caractere – armazenado em DL DL = 30 + Carry se Carry = NC então 30 + 0 se Carry = CY então 30 + 1 30 é o caractere ASCII ZERO 31 é o caractere ASCII UM Não esqueça de executar o comando G, a partir de IP = 0100 Apresentação de Dados • Outros Flag’s – Zero Flag (ZF) – Sinalizado com ZR (zero) ou NZ (não zero) – Sign Flag (SF) – Sinalizado com NG (negativo) ou PL (positivo) – Over Flag (OF) – Sinalizado com OV – (overflow) ou NV – (não overflow) Apresentação de Dados • Analisando o Flag ZF Operação executada zerou o valor do registrador de estado Apresentação de Dados • Analisando os Flags: Sign Flag (SF) e Over Flag (OF) 0111 0000 0000 0000 + 0110 0000 0000 0000 Apresentação de Dados – Instruções de Saltos Condicionais • Saltos a partir da verificação dos registradores de estados: – Jump on Zero (JZ): Salta para um endereço caso o registrador Zero Flag esteja sinalizado como zerado (ZR) – Jump not Zero (JNZ): Salta para um endereço caso o registrador de estado Zero Flag não esteja sinalizado com zero (NZ). • Exemplo de programa: Apresentar na tela a letra A enquanto BL > 0, quando BL atingir Zero apresentar a letra B. Apresentação de Dados – Instruções de Saltos Condicionais • O Programa Quantidade de letras que será apresentado AX = 0200, vou imprimir alguma coisa, Hein!!! DX = 0041, valor ASCII do caractere A Interrupção utilizada para imprimir BL = BL - 1 Salta para o endereço 106 eqto ZF = NZ Valor ASCII do caractere B Ajuste o IP 0100 e execute o comando G. Saída emitida: AAAB Apresentação de Dados – Verificando o CMP • Configura seu computador da seguinte forma: • Execute o comando T do shell • • • • Saia do debug e retorne com ele na memória. Entre com AAAA em AX e BX Adiciona o endereço 0100 a linha de código CMP AX, BX. Verifique o valor de IP Apresentação de Dados – Instruções de Saltos Condicionais • Veja só o que fizemos: • Execute o comando T e veja o resultado Apresentação de Dados – Instruções de Saltos Condicionais • Executando .... • Esta instrução também está presente no MIPS – como nome de SLT. Apresentação de Dados • Objetivo: mostrar um valor de um dígito expresso em notação hexadecimal. – 0aF – – – – – – – – – – – Tabela ASCII para esses valores 0 30 : 1 31 ; 2 32 < 3 33 = 4 34 > 5 35 ? 6 36 @ 7 37 A 8 38 B 9 39 C • Parte numérica – 30 a 39 • Parte alfabética de 41 a 46 3A 3B 3C 3D 3E 3F 40 41 42 43 D E F 44 45 46 Apresentação de Dados • Utilizar dois grupos de caracteres – 30 a 39 – 40 a 46 – Diferença de 7 posições. Soma 30 em DL, pois 0 começa no trinta – vide tabela ASCII DL – 39 Salta para 010f se zf = zr 010F Apresentação de Dados • O comando SHR – Rotaciona para direita um número X de bits. Este número deve estar armazenado em CL. Valor máximo da rotação = 16 (10hex). Apresentação de Dados • Exibindo valores em hexadecimal (nibble a esquerda da parte baixa de bx). [Escreva em seu caderno qual o processamento realizado por cada linha]. Apresentação de Dados • Utilizando comando e para exibir um valor em hexa (nibble a direita de part baixa de bx). 0B45:0100 mov ah,02 Apresentação de Dados • Exibindo dos dígitos em hexa na tela (toda parte baixa de bx). Utilizando shr para exibir o nibble mais a esquerda Utilizando shr para exibir o nibble mais a direira Entrada de Dados • Utilizar a int 21 com controle de entrada 01 em AH. Exemplo Leitura e armazenamento do valor hexadecimal, armazenando em AL Leitura do valor 05, Armazenado em al com 35 (ascii ref a 5) 35 – 30 = 5 AL - 09 Salta para 010c se zf = zr Subtrai 07 em al, encontrando as letras. Entrada de Dados • Leitura de dois caracteres em Hexa Possibilita leitura Realiza a leitura ex: A = 61 Realiza a leitura ex: DL = AL Realiza a leitura ex: DL = 31 DL - 9 Se zf = zr DL - 7 = 2A CL = 4 Move para esquerda (L) um nibble de DL Nova leitura ex: A = 61 AL = AL – 30 AL - 9 Se zf = zr AL – 7 = 2A DL = A + 2A