我在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
答案 0 :(得分:1)
div ebx
需要输入EAX
,EBX
和EDX
中的某些值,并更改EAX
和EDX
。至少你忘了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
...
请注意,您以反向顺序获得结果(余数)!