Hi
I am very new to assembly.  I am trying to convert some numbers to binary.  I have written most of the code so far, but can't figure out how to convert to binary.  The user enters a number that number is stored in one register in another final register initialized to 0 the value is multiplied by 10 and the stored number is added so that if the user enters 1 the answer is one if they then enter a 2 the answer is 12, and so on.  I then have to convert the final number entered to binary.  That is where I am stuck.  Here is what I have so far...I have been trying test, but that doesnt seem to work. 
 mov         eax,char_prompt
            call        print_string            ; request a char. input
            call        print_nl
            mov        edx,0

L1:                                            ;Loop 1
            call        get_kb                  ; read input character
            cmp        AL, 0Dh                ; compare the key entered to CR
            je          false2
true:
 
            cmp        AL, '0'                ; compare AL to 0
            jl          false2                  ; no match do second else

            cmp        Al, '9'                ;compare AL to 9
            jg          false2                  ;no match do second else
   
            sub        al,'0'                  ; subtract 0 from what ever is in AL
            mov        ,al            ;move whatever is in AL to inputdigit
                     
            imul        edx,10                ;multiply edx by 10
         
           
            add        edx,            ;add value in input1 to value in edx
            mov        eax,edx                ;move value in edx to eax
                     
           
            call        print_int
            call        print_nl
            loop        L1
false2:
            mov        eax,out_msg3
            call        print_string            ;jump to error statement
            call        print_nl
Posted on 2008-06-20 00:47:35 by cannsyl
When you have the decimal number in a DWORD var or a register,  to show that into binary, for the 32 bits you just have to test whether the highest bit is set and print "0" or "1".

mov eax,value

mov ecx,0
.while ecx<32
    .if eax & 80000000h ; is highest bit set?
            print "1"
    .else
            print "0"
    .endif
    shl eax,1 ; make bit 30 become bit 31

    inc ecx
.endw


But this will always print 32 bits, won't skip the leading zeroes. So, let's skip them:


mov eax,value
.if !eax
print "0"
ret
.endif

xor ecx,ecx
.while !(eax & 80000000h)
shl eax,1
inc ecx
.endw

next_bit:
    .if eax & 80000000h
        print "1"
    .else
        print "0"
    .endif
    shl eax,1
    inc ecx
    cmp ecx,32
    jl next_bit



Of course, many tricks spawn as optimizations or fun around that code
Posted on 2008-06-20 10:11:12 by Ultrano
Thanks so much for the help.  I kind of understand the concept you gave, but I can't use .if how would I do a !eax in assembly with gvim?  Thanks
Posted on 2008-06-23 10:12:06 by cannsyl
test eax,eax
jnz _notZero

So, the second code I posted above can be transformed with Carry-flag tricks like this:

PrintBinary proc uses edi Value,lpszText
mov edx,Value
mov edi,lpszText
test edx,edx
jz _onZero
xor ecx,ecx

mov ecx,32
;----[ find the first '1' bit ]----[
@@:
dec ecx
shl edx,1
jnc @B

;----------------------------------/

;----[ restore that '1' bit we took-away ]---[
shr edx,1
or edx,80000000h
;--------------------------------------------/


;---[ for each next bit ]----[
next_bit:
shl edx,1  ; move highest bit into Carry-Flag
mov al,'0' ; we want to print "0" or "1", so put "0" into AL
adc al,0   ; this will add 0 or 1 to al, depending on CarryFlag. So, if(CarryFlag==false)al="0"; else al="1";
stosb      ; equals "mov ,al | inc edi"
dec ecx    ; decrese number of bits left to check
jge next_bit ; repeat code if bits_left_to_check >=0 . (we had decremented ecx once too much while searching for the first "1", so we use ">=0" instead of ">0")
;----------------------------/



mov byte ptr,0 ;zero-terminate
ret
_onZero:
mov word ptr,'0' ; put '0' in string, and zero-terminate
ret
PrintBinary endp
...

.data?
MyStringResult db 100 dup (?)
.code
invoke PrintBinary,0FFh,addr MyStringResult

invoke MessageBox,0,addr MyStringResult,0,0
Posted on 2008-06-23 11:54:50 by Ultrano
I just wrote this one in NASM. It returns the number of bytes copied to the destination string.

; 覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧  
  __DecToBinStr:
    ; DWORD __DecToBinStr (DWORD DecimalValue, char* DestinationString, Boolean SkipTrailingZeros); StdCall;
    ; Returns the number of bytes copied to the string (Including the null-terminator)
   
    PUSH      EBX
    PUSH      ECX
    PUSH      EDX
    PUSH      ESI
    PUSH      EDI
    PUSH      EBP
    MOV      EBP , ESP
   
    ; = DecimalValue
    ; = DestinationString
    ; = SkipTrailingZeros

    .PredictReturnValue:
      XOR      ECX , ECX
     
    .GetParameterValues:
      MOV      EDI , DWORD PTR ;
      MOV      ESI , DWORD PTR ;
      MOV      EDX , DWORD PTR ;
      MOV      EAX , 0x00000020

      ; EDI =
      ; ESI =
      ; EDX =

    .CheckForNULLDestinationString:
      TEST      EDI , EDI
      JZ        .EP
   
    .CheckForZeroInput:
      INC      ECX
      MOV      EBX , 0x00000030
      TEST      ESI , ESI
      JNZ      .CheckForSkippingTrailingZeros
      MOV      DWORD PTR , EBX     
      JMP      .SetResult

    .CheckForSkippingTrailingZeros:
      TEST      EDX , EDX
      JZ        .PrepareToTransfer
      .RemoveLeadingZeros:
        DEC      EAX
        SHL      ESI , 0x00000001
        JNC      .RemoveLeadingZeros
        RCR      ESI , 0x00000001
        INC      EDX

    ; EDX = Free
    ; ECX = Return Value
    ; EBX = '0', 0, 0, 0
    ; EDI =
    ; ESI =
    ; EAX = Number of bits that we have to transfer to the destination string
     
    .PrepareToTransfer:
      MOV      DWORD PTR , EBX
      SHL      ESI , 0x00000001
      JNC      .MoveForward
      INC      DWORD PTR
      .MoveForward:
        INC      EDI
        INC      ECX
        DEC      EAX
        JNZ      .PrepareToTransfer

    .SetResult:
      MOV      EAX , ECX                 
   
    .EP:
      MOV      EAX , ECX
      POP      EBP
      POP      EDI
      POP      ESI
      POP      EDX
      POP      ECX
      POP      EBX
    RET      (0x03 * 0x04)
; 覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧覧
Posted on 2008-06-28 15:13:56 by XCHG