div 操作结束(x86 程序集)

div operation wraps over (x86 assembly)

我在 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

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
...

考虑一下,您以 反向 顺序得到结果(余数)!