8. Instruções de multiplicação e divisão



Documentos relacionados
7. Instruções lógicas, de deslocamento e de rotação

7. A pilha e subrotinas

Atividade prática: Rodando o programa SOMA

LABORATÓRIO DE LINGUAGEM DE MONTAGEM INTERRUPÇÕES DO DOS E DA BIOS

ORGANIZAÇÃO BÁSICA DE COMPUTADORES E LINGUAGEM DE MONTAGEM

Laboratório de Sistemas Processadores e Periféricos Lista de comandos de Assembly

LABORATÓRIO DE LINGUAGEM DE MONTAGEM. MACROS e GERENCIAMENTO DE MEMÓRIA

Programação ao nível da máquina. Operações lógicas e aritméticas

Linguagem de Montagem 2. Operações e Operandos

Os 3 principais tipos de Instruções (INSTRUTION SET) dos up são:

Laboratório de Sistemas Processadores e Periféricos

INT 5h - Print screen Modo Resolução Caract. INT 10h - Vídeo INT 10h - Vídeo

Interface Hardware/Software. Centro de Informática - UFPE Paulo Maciel prmm@cin.ufpe.br

Arquitetura de Computadores. Tipos de Instruções

Representação de Dados e Sistemas de Numeração

Introdução. Programando em Assembly. Primeiro Exemplo (2) Primeiro Exemplo (1) Linguagem Assembly do 8086/8088

ORGANIZAÇÃO BÁSICA DE COMPUTADORES E LINGUAGEM DE MONTAGEM. Conceitos Básicos ORGANIZAÇÃO BÁSICA DE COMPUTADORES E LINGUAGEM DE MONTAGEM

Arquitetura de Computadores

Operadores lógicos (bit a bit)

Ambiente de desenvolvimento de Programação Assembly MCU 8051 IDE

Exercícios de Fixação Pseudocódigo e Estruturas Básicas de Controle

CONSTRUÇÃO DE UMA UCP HIPOTÉTICA M++ INTRODUÇÃO

Organização de Computadores 1

Exemplo de Subtração Binária

Curso de C. Introdução by Arnaldo V. Moura e Daniel F. Ferber

Sistemas Numéricos e a Representação Interna dos Dados no Computador

PCS-2302 / PCS-2024 Lab. de Fundamentos de Eng. de Computação

Programando em Assembly

Introdução à programação em linguagem assembly

Uso de interrupções de BIOS/DOS

Algoritmos e Estruturas de Dados I 01/2013. Estruturas Condicionais e de Repetição (parte 2) Pedro O.S. Vaz de Melo

Organização de Computadores 1

Codificação 1. Introdução. C 2 R r {! + codificação

SISTEMAS DIGITAIS Prof. Ricardo Rodrigues Barcelar

ULA Sinais de Controle enviados pela UC

A declaração de uma variável vel define o seu tipo. O tipo do dado define como ele será: Armazenado na memória. Manipulado pela ULA.

Linguagem de Montagem

Escola Secundária c/3º CEB José Macedo Fragateiro. Curso Profissional de Nível Secundário. Componente Técnica. Disciplina de

Pilhas. Profa Morganna Diniz

Programação Básica em Arduino Aula 2

Organização e Arquitetura de Computadores I

Sistemas de Numerações.

Pontifícia Universidade Católica do Rio Grande do Sul Faculdade de Engenharia Disciplina de Lógica Computacional Aplicada. Prof. Dr.

2. OPERADORES ALGORITMOS, FLUXOGRAMAS E PROGRAMAS FUNÇÕES... 10

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À ORGANIZAÇÃO DE COMPUTADORES

INSTRUÇÕES DE TRANSFERÊNCIA

Python Condicionais e Loops. Introdução à Programação SI1

Gerenciador de Boot Simples

2. Sistemas de Numeração, Operações e Códigos. 2. Sistemas de Numeração, Operações e Códigos 1. Números Decimais. Objetivos.

José Augusto Fabri. Assembly Básico

20 Caracteres - Tipo char

Geração de código. Ivan Ricarte INTRODUÇÃO À COMPILAÇÃO

Sistemas de Numeração

CAPÍTULO 6 ARITMÉTICA DIGITAL

Dispositivos de Entrada e Saída

3 Sistemas de Numeração:

Conversões em Sistemas de Numeração. José Gustavo de Souza Paiva

2 Formalidades referentes ao trabalho

Sistemas de Numeração

Programação de Computadores I Pseudocódigo PROFESSORA CINTIA CAETANO

Algoritmos e Programação

Introdução à Engenharia de

Aula Prática 1 Introdução à programação Assembly no DOS usando TASM Bruno Silva bs@cin.ufpe.br lauro Moura lauromoura@gmail.com

JSP - ORIENTADO A OBJETOS

CRIANDO UM SISTEMA OPERACIONAL BÁSICO Por: Fernando Birck aka Fergo

Curso : Tecnologia em Desenvolvimento de Sistemas - AEMS

ArchC. Wesley Nunes Gonçalves

Conjunto de instruções e modos de. aula 4. Profa. Débora Matos

Cálculo Numérico Aula 1: Computação numérica. Tipos de Erros. Aritmética de ponto flutuante

CURSO BÁSICO DE PROGRAMAÇÃO AULA 7

Engenharia Electrotécnica/ Engenharia Informática Microprocessadores e Aplicações

Software Básico. Conceito de Linguagem de Máquina e Montagem: introdução ao Assembly. Prof. MSc. Hugo Vieira L. Souza

A linguagem ASSEMBLY

Componentes da linguagem C++

Fabio Bento

MATA49 Programação de Software Básico

Capítulo 2. Numéricos e Códigos Pearson Prentice Hall. Todos os direitos reservados.

Arquitetura de Computadores. Prof. João Bosco Jr.

ULA- Unidade Lógica Aritmética. Prof. Rômulo Calado Pantaleão Camara. Carga Horária: 60h

centena dezena unidade

PROGRAMADOR JAVA. Aula 0 20 semanas. Instrutor : Léo Billi leo.billi@gmail.com

EEL Microprocessadores

Representação de Dados

Programação. Folha Prática 3. Lab. 3. Departamento de Informática Universidade da Beira Interior Portugal Copyright 2010 All rights reserved.

Aula 5. Simplificação de funções lógicas (cont.) Sistemas de numeração

MÓDULO. Conjunto de Instruções do 8086/88 Aritméticas, lógicas, deslocamento e rotação M 02

Eletrônica Digital 1 Módulo1 Capítulo 1 Sistemas Numéricos. Prof. Nilton Costa Junior

LINEAR EQUIPAMENTOS RUA SÃO JORGE, 267/269 - TELEFONE: (11) SÃO CAETANO DO SUL - SP - CEP:

Unidade: Unidade Lógica e Aritmética e Registradores. Unidade I:

UNIBRATEC Ensino Superior e Técnico em Informática DHD Desenvolvimento em Hardware

Nível da Arquitetura do Conjunto das Instruções

Curso: Técnico de Informática Disciplina: Redes de Computadores. 1- Apresentação Binária

Unidade 10: A Unidade Lógica Aritmética e as Instruções em Linguagem de Máquina Prof. Daniel Caetano

Capítulo 2: Introdução à Linguagem C

Introdução a Algoritmos Parte 04

Transcrição:

Cap8.1 8. Instruções de multiplicação e divisão 8.1 Instruções de multiplicação MUL fonte IMUL fonte MUL (multiply) -> usada com números em representação não-sinalizada IMUL (integer multiply) -> usada com números sinalizados Multiplicação com números em formato byte: - registradores de 8 bits e variáveis de tipo DB - segundo operando é assumido em AL - resultado (destino) pode atingir 16 bits e se encontra em AX Multiplicação com números em formato word: - registradores de 16 bits e variáveis de tipo DW - segundo operando é assumido em AX - resultado pode atingir 32 bits (tamanho doubleword) e se encontra em DX -> 16 bits mais significativos (high word) AX -> 16 bits menos significativos (low word) Para números positivos (MSB = 0), MUL e IMUL dão o mesmo resultado. Flags afetados: SF, ZF, AF, PF -> indefinidos após MUL, CF/OF (ambos) = 0, se a metade superior do resultado é 0 = 1, caso contrário após IMUL, CF/OF (ambos) = 0, se a metade superior do resultado for extensão do sinal da metade inferior = 1, caso contrário

Cap8.2 Exemplos de casos de multiplição: 1) Suponha que AX contenha 0001h BX contenha FFFFh: antes: AX = 0001 h = 0000 0000 0000 0001b = 1 ou +1 BX = FFFF h = 1111 1111 1111 1111b = 65535 ou -1 Instrução Resultado Resultado DX AX CF/OF decimal hexadecimal MUL BX 65535 0000 FFFF h 0000 h FFFF h 0 IMUL BX -1 FFFF FFFF h FFFF h FFFF h 0 2) Suponha que AX contenha 0FFF h: antes: AX = 0FFF h = 0000 1111 1111 1111 h = 4095 ou + 4095 Instrução Resultado Resultado DX AX CF/OF decimal hexadecimal MUL AX 16769025 00FF E001 h 00FF h E001 h 1 IMUL AX 16769025 00FF E001 h 00FF h E001 h 1 3) Suponha que AL contenha 80h BL contenha FFh: antes: AL = 80 h = 1000 0000 b = 128 ou -128 BL = FF h = 1111 1111 b = 255 ou -1 Instrução Resultado Resultado AH AL CF/OF decimal hexadecimal MUL BL 32640 7F80 h 7F h 80 h 1 IMUL BL 128 0080 h 00 h 80 h 1

Cap8.3 8.2 Instruções de divisão DIV fonte IDIV fonte DIV (divide) -> usada com números em representação não-sinalizada IDIV (integer divide) -> usada com números sinalizados fonte deve ser considerado como divisor (não pode ser uma constante) Divisão com números em formato byte: - o divisor é assumido ser de 8 bits (1 byte) - o dividendo é assumido estar em AX (16 bits) - após a execução: o quociente de 8 bits estará em AL o resto de 8 bits estará em AH Divisão com números em formato word: - o divisor é assumido ser de 16 bits (1 word) - o dividendo é assumido ser de 32 bits: DX -> 16 bits mais significativos do dividendo AX -> 16 bits menos significativos do dividendo (high word) (low word) - após a execução: o quociente de 16 bits estará em AX o resto de 16 bits estará em DX Para números positivos (MSB = 0), DIV e IDIV fornecem o mesmo resultado. Flags afetados: todos ficam indefinidos Em divisão de números em representação sinalizada, o resto possui o mesmo sinal do dividendo.

Cap8.4 Exemplos de casos de divisão: 1) Suponha que DX e AX contenham 0000h e 0005h, e BX contenha FFFEh: antes: DX : AX = 0000 0005 h = 5 ou + 5 BX = FFFE h = 65534 ou - 2 Instrução Quociente Resto decimal AX DX decimal DIV BX 0 5 0000 h 0005 h IDIV BX -2 1 FFFE h 0001 h 2) Suponha que AX contenha 0005 h e BL contenha FF h: antes: AX = 0005 h = 5 ou + 5 BL = FF h = 256 ou - 1 Instrução Quociente Resto decimal AL AH decimal DIV BL 0 5 00 h 05 h IDIV BL - 5 0 FB h 00 h 3) Suponha que AX contenha 00FB h e BL contenha FF h: antes: AX = 00FB h = 251 ou + 251 BL = FF h = 256 ou - 1 Instrução Quociente Resto decimal AL AH decimal DIV BL 0 251 00 h FB h IDIV BL -251 * - - - (*) como -251 não cabe em AL (8 bits) -> ocorre DIVIDE OVERFLOW situação de erro catastrófico que faz com que o programa termine.

Cap8.5 8.3 Extensão do sinal do dividendo a) Em operações em formato word: Caso o dividendo de uma divisão (composto de DX : AX) ocupe apenas AX, DX deve ser preparado, pois é sempre considerado: - Em DIV -> DX deve ser zerado - EM IDIV -> DX deve ter a extensão de sinal de AX CWD instrução sem operandos (zero operandos) que converte word para doubleword e estende o sinal de AX para DX; deve ser usada com IDIV b) Em operações em formato byte: Caso o dividendo de uma divisão (composto por AX) ocupe apenas AL, AH deve ser preparado, pois é sempre considerado. - Em DIV -> AH deve ser zerado - EM IDIV -> AH deve ter a extensão de sinal de AL CBW instrução sem operandos (zero operandos) que converte byte para word e estende o sinal de AL para AH; deve ser usada com IDIV

Cap8.6 Exemplos de divisões com ajuste de extensão: 1) Crie um trecho de programa que divida -1250 por 7.... MOV AX, -1250 CWD MOV BX,7 IDIV BX... ;AX recebe o dividendo ;estende o sinal de AX para DX ;BX recebe o divisor ;executa a divisão ;após a execução, AX recebe o ;quociente e DX recebe o resto 2) Crie um trecho de programa que divida a variável sinalizada XBYTE por -7.... MOV AL,XBYTE ;AL recebe o dividendo CBW ;estende o sinal (eventual) de ;AL para AH MOV BL, -7 ;BL recebe o divisor IDIV BL ;executa a divisão ;após a execução, AL recebe o ;quociente e AH recebe o resto... Obs: Não há efeito de CBW e CWD sobre os FLAGS.

Cap8.7 8.4 E/S de números decimais Entrada de números decimais: - string de caracteres números de 0 a 9, fornecidos pelo teclado; - CR é o marcador de fim de string; - AX é assumido como registrador de armazenamento; - valores decimais permitidos na faixa de - 32768 a + 32767; - sinal negativo deve ser apresentado. Algoritmo básico em linguagem de alto nível: total = 0 negativo = FALSO ler um caracter CASE caracter OF - : negativo = VERDADEIRO e ler um caracter + : ler um caracter END_CASE REPEAT converter caracter em valor binário total = 10 x total + valor binário ler um caracter UNTIL caracter é um carriage return (CR) IF negativo = VERDADEIRO THEN total = - (total) END_IF Obs: o loop do tipo CASE pode ser entendido como um IF múltiplo, que testa simultaneamente os vários "casos": se algum deles for verdadeiro, executa as instruções relacionadas; se todos os "casos" forem falsos, não executa nada e vai para o fim do CASE.

Cap8.8 Subrotina de entrada de números decimais em Linguagem Montadora: ENTDEC PROC ;le um numero decimal da faixa de -32768 a +32767 ;variaveis de entrada: nehuma (entrada de digitos pelo teclado) ;variaveis de saida: AX -> valor binario equivalente do numero decimal PUSH BX PUSH CX PUSH DX ;salvando registradores que serão usados XOR BX,BX ;BX acumula o total, valor inicial 0 XOR CX,CX ;CX indicador de sinal (negativo = 1), inicial = 0 MOV AH,1h INT 21h ;le caracter no AL CMP AL, - ;sinal negativo? JE MENOS CMP AL, + ;sinal positivo? JE MAIS JMP NUM ;se nao é sinal, então vá processar o caracter MENOS: MOV CX,1 ;negativo = verdadeiro MAIS: INT 21h ;le um outro caracter NUM: AND AX,000Fh ;junta AH a AL, converte caracter para binário PUSH AX ;salva AX (valor binário) na pilha MOV AX,10 ;prepara constante 10 MUL BX ;AX = 10 x total, total está em BX POP BX ;retira da pilha o valor salvo, vai para BX ADD BX,AX ;total = total x 10 + valor binário MOV AH,1h INT 21h ;le um caracter CMP AL,0Dh ;é o CR? JNE NUM ;se não, vai processar outro dígito em NUM MOV AX,BX ;se é CR, então coloca o total calculado em AX CMP CX,1 ;o numero é negativo? JNE SAIDA ;não NEG AX ;sim, faz-se seu complemento de 2 SAIDA: POP DX POP CX POP BX ;restaura os conteúdos originais RET ;retorna a rotina que chamou ENTDEC ENDP

Cap8.9 Saída de números decimais: - AX é assumido como registrador de armazenamento; - valores decimais na faixa de - 32768 a + 32767; - exibe sinal negativo, se o conteúdo de AX for negativo; - string de caracteres números de 0 a 9, exibidos no monitor de vídeo. Algoritmo básico em linguagem de alto nível: IF AX < 0 THEN exibe um sinal de menos substitui-se AX pelo seu complemento de 2 END_IF contador = 0 REPEAT dividir quociente por 10 colocar o resto na pilha contador = contador + 1 UNTIL quociente = 0 FOR contador vezes DO retirar um resto (número) da pilha converter para caracter ASCII exibir o caracter no monitor END_FOR Idéia básica da técnica de decomposição decimal do número em AX: Pilha 24618 dividido por 10 = 2461 com resto 8 -> 0008h 2461 dividido por 10 = 246 com resto 1 -> 0001h 246 dividido por 10 = 24 com resto 6 -> 0006h 24 dividido por 10 = 2 com resto 4 -> 0004h 2 dividido por 10 = 0 com resto 2 -> 0002h <- Topo

Cap8.10 Subrotina de saída de números decimais em Linguagem Montadora: SAIDEC PROC ;exibe o conteudo de AX como decimal inteiro com sinal ;variaveis de entrada: AX -> valor binario equivalente do número decimal ;variaveis de saida: nehuma (exibição de dígitos direto no monitor de video) PUSH AX PUSH BX PUSH CX PUSH DX ;salva na pilha os registradores usados OR AX,AX ;prepara comparação de sinal JGE PT1 ;se AX maior ou igual a 0, vai para PT1 PUSH AX ;como AX menor que 0, salva o número na pilha MOV DL,' - ' ;prepara o caracter ' - ' para sair MOV AH,2h ;prepara exibição INT 21h ;exibe ' - ' POP AX ;recupera o número NEG AX ;troca o sinal de AX (AX = - AX) ;obtendo dígitos decimais e salvando-os temporariamente na pilha PT1: XOR CX,CX ;inicializa CX como contador de dígitos MOV BX,10 ;BX possui o divisor PT2: XOR DX,DX ;inicializa o byte alto do dividendo em 0; restante é AX DIV BX ;após a execução, AX = quociente; DX = resto PUSH DX ;salva o primeiro dígito decimal na pilha (1o. resto) INC CX ;contador = contador + 1 OR AX,AX ;quociente = 0? (teste de parada) JNE PT2 ;não, continuamos a repetir o laço ;exibindo os dígitos decimais (restos) no monitor, na ordem inversa MOV AH,2h ;sim, termina o processo, prepara exibição dos restos PT3: POP DX ;recupera dígito da pilha colocando-o em DL (DH = 0) ADD DL,30h ;converte valor binário do dígito para caracter ASCII INT 21h ;exibe caracter LOOP PT3 ;realiza o loop ate que CX = 0 POP DX ;restaura o conteúdo dos registros POP CX POP BX POP AX ;restaura os conteúdos dos registradores RET ;retorna à rotina que chamou SAIDEC ENDP

Cap8.11 Exemplo de um programa utilizando ENTDEC e SAIDEC TITLE PROGRAMA DE E/S DECIMAL.MODEL SMALL.STACK 100h.DATA MSG1 DB 'Entre um numero decimal na faixa de -32768 a 32767:$' MSG2 DB 0Dh, 0Ah, 'Confirmando a entrada efetuada, voce digitou:$'.code PRINCIPAL PROC MOV AX,@DATA MOV DS,AX MOV AH,9h LEA DX,MSG1 INT 21h ;entrada do número CALL ENTDEC ;chama subrotina ENTDEC PUSH AX ;salva temporariamente o número na pilha ;exibindo a segunda mensagem MOV AH,9h LEA DX,MSG2 INT 21h ;exibe a segunda mensagem ;exibindo o número lido POP AX ;recupera o número na pilha CALL SAIDEC ;chama subrotina SAIDEC ;saida para o DOS MOV AH,4Ch INT 21h PRNCIPAL ENDP INCLUDE: C:\<diretorio_de_trabalho>\ENTDEC.ASM INCLUDE: C:\<diretorio_de_trabalho>\SAIDEC.ASM END PRINCIPAL

Cap8.12 Exercícios sugeridos: 1) Dê os conteúdos de DX, AX e CF/OF após a execução de cada uma das seguintes instruções (operandos de 16 bits com resultado em 32 bits): a) MUL BX ;se AX = 0008h e BX = 0003h b) IMUL CX ;se AX = 0005h e CX = FFFFh 2) Dê os conteúdos de AX e CF/OF após a execução de cada uma das seguintes instruções (operandos de 8 bits com resultado em 16 bits): a) MUL BL ;se AL = ABh e BL = 10h b) IMUL BYTE1 ;se AL = 02h e BYTE1 = FBh 3) Dê os conteúdos de AX e DX após a execução de cada uma das seguintes instruções (dividendo de 32 bits, divisor de 16 bits, resultando em quociente e resto ambos de 16 bits): a) DIV BX ;se DX = 0000h, AX = 0007h e BX = 0002h b) IDIV BX ;se DX = FFFFh, AX = FFFCh e BX = 0003h 4) Dê os conteúdos de AL e AH após a execução de cada uma das seguintes instruções (dividendo de 16 bits, divisor de 8 bits, resultando em quociente e resto ambos de 8 bits): a) DIV BL ;se AX = 000Dh e BL = 03h b) IDIV BL ;se AX = FFFBh e BL = FEh 5) O que ocorre após a execução de: a) CWD ;se AX = 8ABCh b) CBW ;se AL = 5Fh

Cap8.13 6) Modifique a subrotina ENTDEC para que a mesma verifique se o dígito decimal que entra pelo teclado está na faixa de 0 a 9, e se o número final produziu ou não overflow. Dica: No algoritmo apresentado, pode ocorrer overflow em dois momentos: - quando AX = 10 x total - quando total = 10 x total + valor binário 7) Escreva um programa que leia uma quantidade de tempo, expressa em segundos, menor ou igual a 65535, e apresente esta quantidade em horas, minutos e segundos (formato HH:MM:SS). Apresente mensagens adequadas e utilize as subrotinas ENTDEC e SAIDEC para realizar a entrada e saída de dígitos decimais (será necessário adaptá-las). 8) Escreva uma subrotina que calcule X n, enésima potência de X, onde as variáveis X e n estão respectivamente em AX e BX. O resultado é passado de volta para a rotina que chamou em dois registradores: DX (16 bits mais significativos) e AX (16 bits menos significativos). Inclua um teste de overflow caso o resultado não caiba em 32 bits. 9) Escreva um programa completo que peça ao usuário, mediante mensagens adequadas, para entrar um número X, entrar um expoente n e apresentar a enésima potência de X. Utilize a subrotina desenvolvida no exercício 8 para o cálculo de X n. Utilize as subrotinas ENTDEC e SAIDEC para E/S de números decimais. Apresente uma mensagem adequada em caso de overflow.