Assembly 英特尔80368 32位汇编程序除法的奇怪结果

Assembly 英特尔80368 32位汇编程序除法的奇怪结果,assembly,x86,division,Assembly,X86,Division,它被困在函数“prebroj”的无限循环中。它应该计算我的结果编号中有多少位数字,这样我可以稍后将其作为字符串返回,并在%eax变为0时退出。当我在调试器中运行它时,当我将我的数字(%eax)除以所需的基数(%ecx)以获得有多少位数字时,在除法后的某一点上,它会返回一个非常奇怪的数字到%eax,但%edx中的除法的其余部分仍然返回完全正常,即使%eax中的结果数字毫无意义。这是代码,它相当长,但我认为它可能有助于提供整个内容。问题循环位于第152行,靠近末端。我在它旁边放了一堆注释,这样更容易

它被困在函数“prebroj”的无限循环中。它应该计算我的结果编号中有多少位数字,这样我可以稍后将其作为字符串返回,并在
%eax
变为0时退出。当我在调试器中运行它时,当我将我的数字(
%eax
)除以所需的基数(
%ecx
)以获得有多少位数字时,在除法后的某一点上,它会返回一个非常奇怪的数字到
%eax
,但
%edx
中的除法的其余部分仍然返回完全正常,即使
%eax
中的结果数字毫无意义。这是代码,它相当长,但我认为它可能有助于提供整个内容。问题循环位于第152行,靠近末端。我在它旁边放了一堆注释,这样更容易找到(唯一的问题是循环,我只是把整个程序放在最上面的注释中,以防相关,简短的程序描述):


这是不归零edx的常见问题。阅读有关
div
工作原理的参考手册。您将看到它使用
edx
作为红利的前32位。如果你只有32位,你需要把它归零。它成功了,干杯!可能重复的Never use div!,始终将idiv与显式操作数一起使用。问题已解决。可能与、、等重复。
#unsigned saberi2 (char *num1, unsigned base1, char *num2, unsigned, base2, char *sum, unsigned *sum_length, unsigned sum_base);
#           8       12      16      20  24      28      32
#the subprogram is called from a c program and takes the first 2 numbers from args 1 and 3 as strings (to be converted), their respective bases from args 2 and 4, and returns the sum as a string at the address from arg 5
.text
.globl saberi2

saberi2:
pushl %ebp
movl %esp, %ebp
pushl %ebx
pushl %esi
subl $16, %esp          # -4(%ebp) i -8(%ebp) su prvi i drugi broj
movl $1, -8(%ebp)
movl $0, -12(%ebp)

prov_prvi:
movl 8(%ebp), %esi
movb (%esi), %bl
cmpb $'-', %bl
jne nm1
movl $-1, -8(%ebp)
incl %esi
jmp np1
nm1:
cmpb $'+', %bl
jne np1
incl %esi
np1:
movl $0, %eax
movl 12(%ebp), %ecx
cmpl $10, %ecx
ja preko10_1

ispod10_1:
movb (%esi), %bl
cmpb $0, %bl
je kraj1
subb $'0', %bl
cmpb $0, %bl
jl greska1
cmpb 12(%ebp), %bl
jg greska1
mull %ecx
movb %bl, -12(%ebp)
addl -12(%ebp), %eax
incl %esi
jmp ispod10_1

preko10_1:
movb (%esi), %bl
cmpb $0, %bl
je kraj1
subb $'0', %bl
cmpb $0, %bl
jl greska1
cmpb $9, %bl
jg slovo1
mull %ecx
movb %bl, -12(%ebp)
addl -12(%ebp), %eax
incl %esi
jmp preko10_1
slovo1:
subb $7, %bl            #17 je razmak od 0 do A
cmpb $10, %bl
jl greska1
cmpb 12(%ebp), %bl
jg greska1
mull %ecx
movb %bl, -12(%ebp)
addl -12(%ebp), %eax
incl %esi
jmp preko10_1

kraj1:
movl -8(%ebp), %ecx
mull %ecx
movl %eax, -4(%ebp)

prov_drugi:
movl 16(%ebp), %esi
movb (%esi), %bl
movl $1, -8(%ebp)
cmpb $'-', %bl
jne nm2
movl $-1, -8(%ebp)
incl %esi
jmp np2
nm2:
cmpb $'+', %bl
jne np2
incl %esi
np2:
movl $0, %eax
movl 20(%ebp), %ecx
cmpl $10, %ecx
ja preko10_2

ispod10_2:
movb (%esi), %bl
cmpb $0, %bl
je kraj2
subb $'0', %bl
cmpb $0, %bl
jb greska2
cmpb 20(%ebp), %bl
ja greska2
mull %ecx
movb %bl, -12(%ebp)
addl -12(%ebp), %eax
incl %esi
jmp ispod10_2

preko10_2:
movb (%esi), %bl
cmpb $0, %bl
je kraj2
subb $'0', %bl
cmpb $0, %bl
jl greska2
cmpb $9, %bl
jg slovo2
mull %ecx
movb %bl, -12(%ebp)
addl -12(%ebp), %eax
incl %esi
jmp preko10_2
slovo2:
subb $7, %bl            #17 je razmak od 0 do A
cmpb $10, %bl
jl greska2
cmpb 20(%ebp), %bl
jg greska2
mull %ecx
movb %bl, -12(%ebp)
addl -12(%ebp), %eax
incl %esi
jmp preko10_2

kraj2:
movl -8(%ebp), %ecx
mull %ecx
addl -4(%ebp), %eax
jo greska3

ispis:
movl 24(%ebp), %ebx     #ebx je adresa zbira
movl %eax, -4(%ebp)     #eax je zbir
movl $0, %esi           #esi je broj cifara zbira
movl 32(%ebp), %ecx     #ecx je baza zbira

prebroj:
cmpl $0, %eax           #brojanje cifara zbira
je unesi            #-----------------------------------------------
divl %ecx           #THIS IS THE LOOP-------------------------------
incl %esi           #-----------------------------------------------
movl %eax, -12(%ebp)
jmp prebroj

unesi:                  #unos cifara na adresu iz arg
movl %esi, 28(%ebp)
movl -4(%ebp), %eax
cmpl $0, %eax
jg nmi
movb $'-', (%ebx)
incl %esi
nmi:
movb $0, (%ebx, %esi, 1)
decl %esi
cmpl $10, %ecx
ja preko10_i

ispod10_i:
cmpl $0, %eax
je preende
divl %ecx
addb $'0', %dl
movb %dl, (%ebx, %esi, 1)
decl %esi
jmp ispod10_i

preko10_i:
cmpl $0, %eax
je preende
divl %ecx
cmpb $9, %dl
ja slovoi
addb $'0', %dl
movb %dl, (%ebx, %esi, 1)
decl %esi
jmp preko10_i
slovoi:
addb $55, %dl
movb %dl, (%ebx, %esi, 1)
decl %esi
jmp preko10_i

greska1:
movl $1, %eax
jmp ende

greska2:
movl $2, %eax
jmp ende

greska3:
movl $3, %eax
jmp ende

preende:
movl $0, %eax
ende:
popl %esi
popl %ebx
movl %ebp, %esp
popl %ebp
ret