Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Assembly cap9, Notas de estudo de Engenharia Telemática

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

Tipologia: Notas de estudo

2010
Em oferta
30 Pontos
Discount

Oferta por tempo limitado


Compartilhado em 30/11/2010

samuel-santos-22
samuel-santos-22 🇧🇷

4.6

(41)

262 documentos

Pré-visualização parcial do texto

Baixe Assembly cap9 e outras Notas de estudo em PDF para Engenharia Telemática, somente na Docsity! Cap9 – Instruções de multiplicação e divisão Página 1 de 13 9. Instruções de multiplicação e divisão 9.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 Cap9 – Instruções de multiplicação e divisão Página 2 de 13 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 decimal Resultado hexadecimal DX AX CF/OF 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 decimal Resultado hexadecimal DX AX CF/OF 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 decimal Resultado hexadecimal AH AL CF/OF MUL BL 32640 7F80 h 7F h 80 h 1 IMUL BL 128 0080 h 00 h 80 h 1 Cap9 – Instruções de multiplicação e divisão Página 5 de 13 9.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 Cap9 – Instruções de multiplicação e divisão Página 6 de 13 Exemplos de divisões com ajuste de extensão: 1) Crie um trecho de programa que divida -1250 por 7. ... MOV AX, -1250 ;AX recebe o dividendo CWD ;estende o sinal de AX para DX MOV BX,7 ;BX recebe o divisor IDIV BX ;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. Cap9 – Instruções de multiplicação e divisão Página 7 de 13 9.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. Cap9 – Instruções de multiplicação e divisão Página 10 de 13 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; o 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 Cap9 – Instruções de multiplicação e divisão Página 11 de 13 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 Cap9 – Instruções de multiplicação e divisão Página 12 de 13 9.5 Atividades práticas. 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
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved