







Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Instruções de multiplicação e divisão
Tipologia: Notas de estudo
1 / 13
Esta página não é visível na pré-visualização
Não perca as partes importantes!








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 :
· Multiplicação com números em formato word :
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
Exemplos de casos de multiplição:
antes: AX = 0001 h = 0000 0000 0000 0001b = 1 ou +
BX = FFFF h = 1111 1111 1111 1111b = 65535 ou -
Instrução Resultado
decimal
Resultado
hexadecimal
MUL BX 65535 0000 FFFF h 0000 h FFFF h 0
IMUL BX -1 FFFF FFFF h FFFF h FFFF h 0
antes: AX = 0FFF h = 0000 1111 1111 1111 h = 4095 ou + 4095
Instrução Resultado
decimal
Resultado
hexadecimal
MUL AX 16769025 00FF E001 h 00FF h E001 h 1
IMUL AX 16769025 00FF E001 h 00FF h E001 h 1
antes: AL = 80 h = 1000 0000 b = 128 ou -
BL = FF h = 1111 1111 b = 255 ou -
Instrução Resultado
decimal
Resultado
hexadecimal
MUL BL 32640 7F80 h 7F h 80 h 1
IMUL BL 128 0080 h 00 h 80 h 1
Exemplos de casos de divisão:
antes: DX : AX = 0000 0005 h = 5 ou + 5
BX = FFFE h = 65534 ou - 2
Instrução Quociente
decimal
Resto decimal AX DX
DIV BX 0 5 0000 h 0005 h
IDIV BX -2 1 FFFE h 0001 h
antes: AX = 0005 h = 5 ou + 5
BL = FF h = 256 ou - 1
Instrução Quociente
decimal
Resto decimal AL AH
DIV BL 0 5 00 h 05 h
IDIV BL - 5 0 FB h 00 h
antes: AX = 00FB h = 251 ou + 251
BL = FF h = 256 ou - 1
Instrução Quociente
decimal
Resto decimal AL AH
DIV BL 0 251 00 h FB h
) 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.
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:
· 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.
deve ser zerado
· instrução sem operandos (zero operandos) que converte byte para word e
estende o sinal de AL para AH;
· deve ser usada com IDIV
9.4 E/S de números decimais
· Entrada de números decimais:
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
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)
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.
Subrotina de entrada de números decimais em Linguagem Montadora:
ENTDEC PROC
;le um numero decimal da faixa de -32768 a +
;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
;entrada de número: mensagem adequada já exibida para o usuário anteriormente
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
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 PT
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,1 0 ;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
Exemplo de um programa utilizando ENTDEC e SAIDEC
.STACK 100h
MSG1 DB 'Entre um numero decimal na faixa de -32768 a 32767:$'
MSG2 DB 0Dh, 0Ah, 'Confirmando a entrada efetuada, voce digitou:$'
MOV AH,9h
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
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
INCLUDE: C:<diretorio_de_trabalho>\ENTDEC.ASM
INCLUDE: C:<diretorio_de_trabalho>\SAIDEC.ASM
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:
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).
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.
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.