[当我尝试运行使用loop
命令的汇编代码时遇到此错误:
“ rip.s:190:错误:-288的值对于497处1个字节的字段太大。]
应该在程序循环时发生此错误。我最初尝试在%ecx寄存器中将“ 3”放入循环之前,但仍然遇到相同的错误。我不确定为什么会这样,所以我真的不知道如何解决它。我已经在下面附上了相关代码:
//Other code
movl %ecx, -20(%ebp)
movl $0, %ecx
addl $3, %ecx
.L24:
xorl %edi, %edi
movl -32(%ebp), %ebx
movl -44(%ebp), %esi
cmpl %esi, -52(%ebp)
movl %ebx, -48(%ebp)
jg .L11
movl -52(%ebp), %eax
movl %ebx, %edx
xorl %edi, %edi
subl $2, %edx
movl %edx, -40(%ebp)
movl %eax, -36(%ebp)
.p2align 4,,7
.p2align 3
.L19:
movl -36(%ebp), %eax
testl %eax, %eax
js .L42
movl 16(%ebp), %ebx
cmpl %ebx, -36(%ebp)
je .L11
.L13:
movl -40(%ebp), %ebx
cmpl %ebx, -32(%ebp)
jl .L14
movl -36(%ebp), %esi
addl 16(%ebp), %esi
movl %edi, -60(%ebp)
movl %esi, -28(%ebp)
jmp .L31
.p2align 4,,7
.p2align 3
.L15:
movl %edx, -24(%ebp)
movl -20(%ebp), %edx
cmpl %edx, %ebx
movl %edx, -20(%ebx)
movl -24(%ebp), %edx
je .L38
.L16:
movl -28(%ebp), %edx
movl 8(%ebp), %edi
movl %edx, %eax
sarl $31, %edx
idivl 16(%ebp)
movl %edx, %esi
movl %eax, -24(%ebp)
movl -20(%ebp), %eax
leal (%ebx,%eax), %edx
movl %eax, -20(%ebp)
movl %edx, %eax
sarl $31, %edx
idivl -20(%ebp)
movl (%edi,%esi,4), %eax
cmpl $1, (%eax,%edx,4)
sbbl $-1, -60(%ebp)
addl $1, %ebx
cmpl -32(%ebp), %ebx
jg .L38
.L31:
testl %ebx, %ebx
jns .L15
addl $1, %ebx
jmp .L16
.p2align 4,,7
.p2align 3
.L38:
movl -60(%ebp), %edi
.L14:
addl $1, -36(%ebp)
movl -44(%ebp), %eax
cmpl %eax, -36(%ebp)
jle .L19
.L11:
movl -44(%ebp), %ebx
movl 8(%ebp), %esi
movl -32(%ebp), %edx
movl -4(%esi,%ebx,4), %eax
addl $1073741823, %edx
movl -56(%ebp), %esi
movl (%eax,%edx,4), %eax
movl -4(%esi,%ebx,4), %ebx
cmpl $1, %eax
adcl $-1, %edi
cmpl $3, %edi
movl %eax, -28(%ebp)
movl $1, %eax
je .L22
xorb %al, %al
cmpl $2, %edi
je .L43
.L22:
addl $1, -32(%ebp)
movl %ebx, -24(%ebp)
movl -20(%ebp), %ebx
cmpl -48(%ebp), %ebx
movl %ebx, -20(%ebp)
movl -24(%ebp), %ebx
movl %eax, (%ebx,%edx,4)
loop .L24 <--Error occurs right here
.L9:
addl $1, -44(%ebp)
jmp .L8
导致错误的原因是什么?
这是编译(汇编)时间错误,而不是运行时错误。 loop
指令的跳转目标只有8位有符号偏移,汇编器试图告诉您目标超出范围。您应将loop
替换为dec ecx; jnz .L24
(为了优化起见,建议始终使用它)。