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
需要在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
...
考虑一下,您以 反向 顺序得到结果(余数)!
我在 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
需要在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
...
考虑一下,您以 反向 顺序得到结果(余数)!