Hi!
I'm trying to write a program that converts an inputted decimal number into its hex equivalent. Here is the source code along with the .h files:
cio.h:Code:.286 .model small datas SEGMENT byte PUBLIC 'data' newl DB 10,13,'$' msg_hex DB "Hexa: $" msg_zec DB "Dec : $" tabela DB '0123456789ABCDEF' bufin DB 6, 7 DUP (?) zece Dw 10 datas ENDS stacks SEGMENT PARA STACK 'stack' db 256 dup(?) stacks ENDS codes SEGMENT BYTE PUBLIC 'code' assume cs:codes,ss:stacks,ds:datas mov ax,datas mov ds,ax jmp start include cio.h include hexa.h include citcuv.h include asciitab.h start: citzec: outstr msg_zec call citcuv outstr newl mov cx, 5 xor ax, ax mov si, offset bufin + 2 trans: mul zece mov dx,ax xor ax,ax lods bufin cmp al, '0' jl citzec cmp al, '9' jg citzec sub al, '0' add dx,ax mov ax,dx loop trans afisare: outstr msg_hex mov dx,ax xor ax,ax mov al, dh call ascii co ah co al xor ax,ax mov al, dl call ascii co ah co al outstr newl final: mov ax,4c00h int 21h codes ENDS end
hexa.h:Code:;reading an inputted character ci macro mov ah,1 int 21h endm ;reading an inputted string in a buffer (bufin) that starts with the even offset in_str macro even pusha mov ah,0ah lea dx,even int 21h popa endm ;outputting a character co macro even pusha mov ah,2 mov dl,even int 21h popa endm ;outputting a string that starts with the even offset outstr macro even pusha mov ah,9 lea dx,even int 21h popa endm
citcuv.h:Code:;the routine converts an ASCII character ('0'...'9' 'A'...'F' 'a'...'f') in a Hexa digit ('0'...'F') ;in: AL = the ASCII character to be converted ;out: CF = 1: invalid character ; CF = 0: CX(CL) = the coresponding Hexa digit tabconvinv db 'fedcbaFEDCBA9876543210' hexa PROC cld mov cx,22 push cs pop ES lea DI,tabconvinv REPNE scasb JZ cont STC RET cont: CMP CX,0FH JBE OK SUB CX,6 ok: CLC RET hexa ENDP
asciitab.h:Code:;the routine transforms a ASCII string in a 16b word ;the routine needs declaration of a bufin strin in the data segment: ;BUFIN DB 6, 7 DUP (?) ;out: CF = 1: invalid character ; CF = 0: DX = word citcuv proc in_str bufin mov cl,bufin+1 xor ch,ch xor dx,dx cld lea si,bufin+2 altcar: push cx lodsb call hexa ;CX = 000h jnc oka ret oka: shl dx,4 ;DX = xxx0 or dx,cx ;DX = xxxh pop cx loop altcar clc ret citcuv endp
The decimal numbers are inputted as 5 digits: 10 = 00010; 142 = 00142; 67528 = 67528Code:;the routine converts a Hexa digit ('0'...'F') in the coresponding ASCII character ('0'...'9' = 30h...39h; 'A'...'F' = 41h...46h) ;the routine uses a conversion tabel like the one declared in the data segment ;tabela db '0123456789ABCDEF' ;in: AL = x:h ;out: AL = car. ASCII ascii proc and al,0fh lea bx,tabela xlat ret ascii endp
The problems I've encountered are:
1. The conversion seems to be going well, but only the second and forth hex characters are outputted correctly
2. How do I treat numbers greater that 65536? This code outputs 4 hex digits, whereas for numbers greater that 65536, 5 hex digits must be outputted
I appreciate any type of help.




Reply With Quote