它在函数" prebroj"中陷入无限循环。它应该计算我的结果编号中有多少位数,这样我可以稍后将其作为字符串返回,并在%eax
变为0时退出。当我在调试器中运行它时,我将我的数字除去(%eax
)通过所需的基数(%ecx
)以获得有多少位数,在除法后的一个点上它返回一个非常奇怪的数字%eax
,但%edx
中的余数除以%eax
1}}保持完全正常返回,即使#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
中的结果数字没有任何意义。这是代码,它相当长,但我认为提供整个东西可能会有所帮助。问题循环在第152行,接近结束。我在它旁边放了一堆注释,以便更容易找到(唯一的问题是循环,我只是将整个程序放在可能相关的情况下,在顶部注释中简短的程序描述):
#dialog{
opacity:0;
z-index:-1;
transition: all 0.5s linear;
}
.Clicked{
opacity:1;
z-index:1;
}