Soma de dois numeros hexadecimais


Calculate two hexadecimal numbers


;=====================================================================
STACK SEGMENT PARA STACK
DB 64 DUP ('STACK')
STACK ENDS
;=====================================================================
;===SEGMENTO DE DADOS
DATA SEGMENT PARA 'DATA'
NUM1 DW ?
NUM2 DW ?
STR1 DB 'Introduza operando_1 (hex): ','$' ; mensagem de introduÁao do primeiro numero
STR2 DB 0Ah,0Dh,'Introduza operando_2 (hex): ','$' ; mensagem de introduÁao do segundo numero
RESULT DB 0Ah,0Ah,0Ah,0Dh,'Resultado da Soma (hex): ','$' ;iniciaÁ„o da mensagem do resultado
carry DB '1','$'
RES DW ?
DATA ENDS

;=====================================================================
;===Segmento de Codigo
CODE SEGMENT PARA 'C0DE'
;===Main do programa

MAIN PROC FAR
ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK
PUSH DS ;guarda na pilha o seg. ds
SUB AX,AX ;garante zero no ax
PUSH AX ;guarda zero na pilha
MOV AX,DATA ;coloca em ax a posiÁao dos dados
MOV DS,AX ;coloca essa posiÁao no registo ds

LEA DX,STR1
CALL WRITE
CALL ASCII2HEX
MOV NUM1,AX

LEA DX, STR2
CALL WRITE
CALL ASCII2HEX
MOV NUM2, AX

LEA DX, RESULT
CALL WRITE

;=====================================================================
;===AdiÁao de numeros

SUB BX,BX
MOV AX,NUM1
ADD AX,NUM2
JNC cont
MOV RES, AX
lea dx, carry
MOV AH,09
INT 21H
cont:
MOV AX,res
CALL HEX2ASCII

RET
MAIN ENDP

;=====================================================================
;===PROCEDIMENTO HEX2ASCII

HEX2ASCII PROC
PUSH CX ;salva cx na pilha
PUSH DX ;salva dx na pilha

MOV CL,4 ;abre contagem rotate
MOV CH,4 ;abre contagem digito
DISPH1:
ROL AX,CL ;posicao do numero
PUSH AX ;salva na pilha ax
AND AL,0FH ;recebe digito hexadecimal
ADD AL,30H ;ajusta-o para converter
CMP AL,'9' ;compara com o '9'
JBE DISPH2 ;salta para disph2 se entre nr 0 e 9
ADD AL,7 ;ajusta-o
DISPH2:
MOV AH,6
MOV DL,AL
INT 21H ;manda o digito para o ecra
POP AX ;tira da pilha para o ax para o restaurar
DEC CH
JNZ DISPH1 ;repete

POP DX ;tira da pilha para restaurar dx
POP CX ;tira da pilha para restaurar cx
RET
HEX2ASCII ENDP

;=====================================================================
;===Procedimento write

WRITE PROC
MOV AH,09
INT 21H
RET
WRITE ENDP

;=====================================================================
;===Convers„o procedimento

CONV PROC
CMP AL,'9'
JBE CNUM ;se for numero
CMP AL,'A'
JB CLETRA ;se for letra
CLETRA:
SUB AL,7
CNUM:
SUB AL,30H
RET
CONV ENDP

;=====================================================================
;===Procedimento ASCII2HEX

ASCII2HEX PROC
PUSH CX
PUSH BX
MOV CX,4 ;abre contagem para shift
MOV SI,CX ;abre contagem
XOR BX,BX ;limpa resultado
READH1:
MOV AH,6 ;le tecla
MOV DL, 0FFH
INT 21H
JE READH1 ;espera pela tecla
MOV DL,AL ;echo
INT 21H
CALL CONV ;converte para hexadecimal
SHL BX,CL ;shift resultado
ADD BL, AL ;adiciona al ao resultado
DEC SI
JNZ READH1 ; repete 4 vezes
MOV AX,BX
POP BX ;tira da pilha para restaurar bx
POP CX ;tira da pilha para restaurar cx
RET
ASCII2HEX ENDP
CODE ENDS
END

0 comentários:

Enviar um comentário