div操作换行(x86程序集)

时间:2015-09-27 06:48:55

标签: assembly x86 masm

我在Visual Studio 2010中有一个我在x86程序集(MASM)中调用的过程。 它所做的就是获取存储在ax寄存器中的基数为10的数字,并将其转换为二进制字符串(例如10100b)。我遇到的问题是,每当ax假设等于1时,它就会翻转并等于一些大数。

.code
main proc

   xor eax, eax
   xor ebx, ebx
   xor ecx, ecx
   xor edx, edx

   lea esi, binResult                           ; convert result to string (binary notation)
   mov ax, [result]
   mov bx, 2
   call Convert2Bin


   lea esi, binResult                           ; test
   call PrintString



   EndofProgram:

   invoke ExitProcess, 0            
main endp


Convert2Bin proc                       ; Define procedure
        pushad                     ; save registers
        pushfd                     ; save flags

        divide_Convert2Bin:

        cmp eax, 1
        je addOne_ThenExit

        cmp eax, 0
        je addZero_ThenExit

        div ebx

        cmp edx, 1
        je addOne_ThenLoop

        cmp edx, 0
        je addZero_ThenLoop

        addOne_ThenLoop:
        mov byte ptr [esi], '1'
        inc esi
        jmp divide_Convert2Bin

        addZero_ThenLoop:
        mov byte ptr [esi], '0'
        inc esi
        jmp divide_Convert2Bin

        addOne_ThenExit:
        mov byte ptr [esi], '1'
        inc esi
        jmp done_Convert2Bin

        addZero_ThenExit:
        mov byte ptr [esi], '0'
        inc esi
        jmp done_Convert2Bin

        done_Convert2Bin:
        mov byte ptr [esi], 'b'

        popfd                      ; restore flags
        popad                      ; restore registers
        ret                        ; return to caller

1 个答案:

答案 0 :(得分:1)

div ebx需要输入EAXEBXEDX中的某些值,并更改EAXEDX。至少你忘了EDX的初始化:

...
pushfd                     ; save flags

mov ebx, 2                 ; Divisor

divide_Convert2Bin:

cmp eax, 1
je addOne_ThenExit

cmp eax, 0
je addZero_ThenExit

xor edx, edx                ; Don't forget to initialize EDX
div ebx
...

请注意,您以反向顺序获得结果(余数)!