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

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -