assembly - Converting User Chosen Base to Base 10 - MASM -
the point of program let user choose base (2-16) , enter in number or numbers base , display them in bases 2,8,10 , 16. 1 of requirements when getting number choices under user chosen base, keep running total , come decimal value. think problem program @ part. in program "number" , "calculating" under function "readinteger". i'm sure have other issues, need fix first continue debugging program. i've been working @ long time , not sure i'm doing wrong. seems eax register isn't clearing properly, thought had under control? appreciate pointers or tips on how debug easier in visual studios masm when there's user input.
here code far:
include irvine32.inc .data prompt byte 'enter base value (2 thru 16 or 0 exit):', 0 prompt1 byte 'enter number in chosen base:', 0 error byte 'that not within accepted range, please try again.', 0 report1 byte 'base 2: ', 0 report2 byte 'base 8: ', 0 report3 byte 'base 10: ', 0 report4 byte 'base 16: ', 0 temp dword ? temp1 dword ? basenumber byte ? .code main proc ; main program control procedure. ; calls: writestring, readinteger, asciitodigit, ; crlf, displayintegers start: xor eax,eax ;clear eax register xor ebx,ebx ;clear ebx register mov edx,offset prompt ;prompt user base choice call writestring mov al,1 ;set al 1 readinteger function call readinteger ;get base choice cmp al,'0' ;if al 0 exit program je finish call asciitodigit ;change character digit mov basenumber,al ;save base choice call crlf ;new line mov edx,offset prompt1 ;prompt user number in chosen base call writestring mov al,2 ;set al 2 readinteger function call readinteger ;get number in chosen base cmp al,'0' ;if al 0 exit program je finish call crlf ;new line call displayintegers ;display results in base 2,8,10 , 16 call crlf ;new line jmp start ;restart program finish: exit ;exit operating system main endp ;------------------------------------------------------------- readinteger proc ; ; takes in user's base choice , numbers. validates both , ; calculates decimal value ; receives: al value of 1 or 2 ; returns: base value in bl , decimal value in temp1 ; calls: readchar,writechar,asciitodigit,islegal,writestring ;---------------------------------------------------------------- mov esi,0 cmp al, 1 ;if al 1 jump base section je base cmp al, 2 ;if al 2 jump number section je number base: call readchar ;read input cmp al,'0' ;jump invalid if less 0 jl invalid cmp al,'0' ;end program if 0 entered je endfunction cmp al,'9' ;jump invalid if more 9 jg invalid cmp al,'1' ;jump 1 if 1 entered je 1 call writechar ;display character entered mov bl,al ;save base number in bl register jmp endfunction ;end function one: call writechar ;display 1 mov bl,10h ;place in 10s column jmp nextchar nextchar: xor eax,eax ;clear eax register call readchar ;read user character entry cmp al,'6' ;jump invalid if entry bigger 6 jg invalid call writechar ;display entry call asciitodigit ;change ascii digit add bl,al ;add previous 10h in bl register jmp endfunction ;end function invalid: mov edx,offset error ;display error message call writestring mov edx,offset prompt ;display prompt re-enter call writestring jmp base number: xor eax,eax ;clear eax register call readchar ;read user entry cmp al,0dh ;with enter jump noneentered je noneentered mov bl,basenumber ;get base number bl register call islegal ;check see if entry legal base choice cmp al,0 ;if al 0 jump number je number mov eax, temp ;put number temp eax register mov temp1,eax ;put value of eax temp1 calculating: call readchar ;read user entry cmp al,0dh ;with enter jump endfunction je endfunction call islegal ;check see if entry legal base choice xor eax,eax ;clear eax register mov eax, temp1 ;put temp1 value in eax register mul ebx ;multiply eax ebx register add eax, temp ;add temp value eax mov temp1, eax ;place new eax value temp1 jmp calculating ;repeat long there no enter press endfunction: ret noneentered: mov al,0 ;al 0 if no legal characters entered ret readinteger endp ;---------------------------------------------------------------- displayintegers proc ; displays number in base 2,8,10,16 using writeinteger ; receives: nothing ; returns: value in bl ; calls: writestring,writeinteger,crlf ;---------------------------------------------------------------- call crlf ;new line mov edx,offset report1 ;display base 2 value call writestring mov bl,2 ;set bl 2 writeinteger function call writeinteger call crlf ;new line mov edx,offset report2 ;display base 8 value call writestring mov bl,8 ;set bl 8 writeinteger function call writeinteger call crlf ;new line mov edx,offset report3 ;display base 10 value call writestring mov bl,10 ;set bl 10 writeinteger function call writeinteger call crlf ;new line mov edx,offset report4 ;display base 16 value call writestring mov bl,16 ;set bl 16 writeinteger function call writeinteger call crlf ;new line ret displayintegers endp ;------------------------------------------------------------------ writeinteger proc ; calculates value in base 2,8,10,16 , displays ; receives: bl value of 2,8,10 or 16 ; returns: nothing ; calls: writechar ;--------------------------------------------------------------------- mov eax,temp1 ;set eax register equal temp1 mov temp,eax ;set temp equal eax value cmp bl,2 ;if bl 2 jump convert2 je convert2 cmp bl,8 ;if bl 8 jump convert8 je convert8 cmp bl,10 ;if bl 10 jump convert10 je convert10 cmp bl, 16 ;if bl 16 jump convert16 je convert16 convert2: xor edx,edx ;clear out edx register xor eax,eax ;clear eax register mov eax,temp ;set eax register equal temp mov ecx,2 ;divide ecx - 2 div ecx mov temp,eax ;move new eax value temp mov eax, edx ;move edx (remainder) eax add eax,30h ;change ascii call writechar ;display character mov eax,temp ;place temp value in eax cmp eax,2 ;if eax less 2 go next jl nextconversion jmp convert2 ;repeat convert8: xor edx,edx ;clear edx register xor eax,eax ;clear eax register mov eax,temp ;divide temp 8 mov ecx,8 div ecx mov temp,eax ;store new eax value in temp mov eax, edx ;store edx (remainder in eax) add eax,30h ;change ascii , display call writechar mov eax,temp ;if temp less 8 jump next cmp eax,8 jl nextconversion jmp convert8 convert10: mov ecx,sizeof temp ;get bit size of temp mov esi,0 ;set place in string writeout: xor eax,eax ;clear eax register mov eax,temp[esi] ;set eax first value in string temp add eax,30h ;display character call writechar inc esi ;go next place in string loop writeout jmp nextconversion convert16: xor edx,edx ;clear edx register xor eax,eax ;clear eax register mov eax,temp ;divide temp 16 mov ecx,16 div ecx mov temp,eax ;put new eax value in temp mov eax, edx ;set edx (remainder) eax cmp eax,9 ;if larger 9 jump hextable jg hextable add eax,30h ;otherwise display character call writechar mov eax,temp ;if temp less 16 go next cmp eax,16 jl nextconversion jmp convert16 hextable: add eax,37h ;find correct character above 9 values call writechar mov eax,temp cmp eax,16 jl nextconversion jmp convert16 nextconversion: ret writeinteger endp ;----------------------------------------------------------------- asciitodigit proc ; ; changes ascii character digit ; receives: ascii character in al register ; returns: decimal value in al register ; calls: none ;------------------------------------------------------------------ cmp al, 60h ;if hexidecimal value greater 60h jump lowercase jg lowercase cmp al, 40h ;if greater 40h jump upper jg uppercase sub al, 30h ;get digit value ret lowercase: ;get lower case value sub al,57h ret uppercase: ;get upper case value sub al,37h ret asciitodigit endp ;------------------------------------------------------------------- digittoascii proc ; converts decimal value ascii character ; receives: decimal al register value ; returns: ascii character value in al register ; calls: none ;------------------------------------------------------------------- cmp al, 9h ;if larger 9h letter jg letter add al, 30h ;change ascii ret letter: ;change ascii add al, 37h ret digittoascii endp ;------------------------------------------------------------------------------ islegal proc ; validates legal values under specific base ; receives: base value in bl register , number in al register validate ; returns: al register value of 0 not legal , 1 legal ; calls: asciitodigit,writechar,digittoascii ;------------------------------------------------------------------------------ call asciitodigit ;change digit cmp al,bl ;compare digit base value je notlegal ;if equal or greater not legal cmp al,bl jg notlegal jmp legal notlegal: ;return 0 in al symbolize not legal mov al,0 ret legal: ;display character , return 1 legal mov temp,eax ;save digit in temp call digittoascii call writechar mov al,1 ret islegal endp end main
Comments
Post a Comment