Anda di halaman 1dari 11

UNIP UNIVERSIDADE PAULISTA

Curso de Cincia da Computao

PROJETO LGICO DE COMPUTADORES


DESENVOLVIMENTO DE UM PROGRAMA EM ASSEMBLY

Helton Luiz dos Santos - RA - B307BC-0


Manoel Ramos Junior - RA B48JIC-9
Vincius Souza Almeida - RA - A70509-0

So Jos dos Campos, 27 de Novembro de 2014.

O programa antes das mudanas no cdigo, pede pra voc digitar um


valor em Hexadecimal de 0 a 99, aps digitar o valor em Hexadecimal e
pressionar a tecla Enter, o programa converte esse valor Hexadecimal em
Binrio, mostrando na tela esse valor convertido para binrio, como podemos
ver na imagem abaixo:
Valor em Hexadecimal:

Valor convertido para Binrio:

Cdigo do programa:

Code_Seg Segment
Assume Cs:Code_Seg, Ds:Data_Seg

Hexa_Bin Proc Near


Mov

Ax, Data_Seg

Mov

Ds, Ax

; Carrega
; Nosso Segmento de Dados

Loop_Texto:
Call Le_Texto
Call Conv_Maiuscula
Call Valida_Texto
Jc

Loop_Texto

Call Imp_Bin
Mov
Int

Ah,4Ch
21h

; retorna ao DOS

Hexa_Bin Endp

Le_Texto Proc Near


Push Ax
Push Dx
Lea

Dx, Texto

; Salva Registradores Utilizados

Loop_Leitura:
Mov

Ah,0Ah

Int

21h

Cmp
Je

Car_Lidos,0

; Leu Algum Caracter ?

Loop_Leitura

Pop

Dx

Pop

Ax

; Nao, Entao tenta de Novo !

Ret
Le_Texto Endp

Conv_Maiuscula

Proc Near

Push Ax
Push Bx
Push Cx
Xor

Ch,Ch

; Zera Parte Alta do Contador

Mov

Cl,Car_Lidos

Lea

Bx,String

Loop_Conversao: Mov
Cmp
Jb
Cmp
Ja

; CL = No de Chars Lidos

Al,[Bx]

Al,'a'
Prox_Byte
Al,'z'
Prox_Byte

; Al e' maior que 'a'


; Nao Entao Passa Para Prox.Byte
; Al e' menor que 'z'
; Nao, Entao Passa Para Prox.Byte

Sub

Al,20h

; Passa Para Maiuscula

Mov

[Bx],Al

; Atualiza Memoria

Prox_Byte:

Inc

Bx

Loop Loop_Conversao
Pop

Cx

Pop

Bx

Pop

Ax

Ret
Conv_Maiuscula

EndP

;------------------------------------------------------------------------;
; Esta Rotina Retorna a Carry Setada Se Houver Algum Erro
;------------------------------------------------------------------------;
Valida_Texto

Proc Near

Push Ax
Push Cx
Mov

Al,String[0]

Cmp

Al,'0'

Jb
Cmp
Ja

; Digito ?

Erro_Digito
Al,'9'
Tenta_Letra

Sub

Al,'0'

Mov

Ah,Al

; Nao, Entao Indica Erro


;
; Nao Esta Certo Ainda
; Converte Para 4 Bits
; Salva

Jmp
Tenta_Letra:

Segundo_Digito
Cmp

Jb
Cmp
Ja

Al,'A'

Erro_Digito
Al,'F'

; Nao e' Valido


;

Erro_Digito

Sub

Al,'A'-10

; Al = 65-10

Mov

Ah,Al

; Salva Resultado em Ah

Segundo_Digito:
Cmp
Jb

Car_Lidos,2
Fim_Digitos

Mov

Al,String[1]

Cmp

Al,'0'

Jb
Cmp
Ja

Erro_Digito
Al,'9'
Tenta_Letra2

Jmp

Acerta_Num

Cmp
Ja

; Nao, Entao Indica Erro


;

Al,'0'

Jb

; Nao Entao Termina

; Digito ?

Sub

Tenta_Letra2:

; Leu Dois caracteres ?

Cmp

; Nao Esta Certo Ainda


; Converte Para 4 Bits

Al,'A'

Erro_Digito
Al,'F'
Erro_Digito

; Nao e' Valido


;
;

Sub

Acerta_Num:

Al,'A'-10

Mov

Cx,4

; Multiplica Por 16

Shl

Ah,Cl

; NOVA INSTRUCAO

Or

Ah,Al

; Combina os Dois Digitos

Mov

Dig_Hexa,Ah

Clc

; Limpa o Carry Flag, NOVA

Jmp

Erro_Digito:

Fim_Valida

Stc

Jmp
Fim_Digitos:

Fim_Valida
Clc

Mov
Fim_Valida:

Dig_Hexa,Al
Pop

Pop

Cx

Ax

Ret
Valida_Texto

Imp_Bin

; Al = 65-10

Endp

Proc Near
Push Ax
Push Bx

; Encerra

Push Cx
Push Dx
Mov

Ah,02

Mov

Bl,Dig_Hexa

Mov

Cx,8

Loop_ImpBin:

Mov

Dl,0

Rcl

Bl,1

; Novas Instrucoes

Adc

Dl,'0'

Int

21h

Loop Loop_ImpBin
Pop

Dx

Pop

Cx

Pop

Bx

Pop

Ax

Ret
Imp_Bin

Endp

Code_Seg Ends

Data_Seg Segment

Texto Label Byte


Tam_String Db 3

Car_Lidos Db 0
String

Db 3 Dup(' ')

Dig_Hexa Db ?

Data_Seg Ends

Stack_Seg SEGMENT STACK


db

10 Dup('Pilha ')

Stack_Seg Ends

End

Hexa_Bin

Aps isso, efetuamos a mudana nos cdigos e o programa passou


mostrar uma "caixa" de asteriscos de 10x10, como pode ser visto na imagem
abaixo:
Programa que mostra uma caixa de asteriscos de 10x10.

Cdigo do programa:
.MODEL SMALL
.STACK 100H
.DATA
MSG DB '**********', 13, 10, '**********',13, 10, '**********',13, 10,
'**********',13, 10, '**********',13, 10, '**********',13, 10, '**********',13, 10,
'**********',13, 10, '**********',13, 10, '**********','$'
.CODE
MAIN PROC
; Inicializa DS

MOV AX,@DATA
MOV DS,AX ;inicializa DS

;
;exibe mensagem
LEA DX,MSG ;carrega o endereo da mensagem
MOV AH,9 ;funo para exibio de string
INT 21H ;executa a funo em AH
;
; Retorna para o DOS
MOV AH,4CH ;funo para retorno ao DOS
INT 21H ;interrupo que executa a funo em AH
MAIN ENDP
END MAIN