在英特尔80368 32位上用汇编程序划分的奇怪结果

时间:2017-05-25 19:10:28

标签: assembly x86 division

它在函数" 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;
 }

0 个答案:

没有答案