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