循环汇编命令何时导致%ecx的负值

时间:2014-03-26 20:53:03

标签: assembly x86

当我尝试运行使用循环命令的汇编代码时,我收到此错误:" rip.s:190:错误:值为-288,对于497&1字节的字段来说太大#34 ;.当程序应该循环时,会发生此错误。我最初试过把#34; 3"在%ecx寄存器进入循环之前,但我仍然得到相同的错误。我不确定为什么会发生这种情况,所以我真的不知道如何修复它。我已附上以下相关代码:

    //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

导致错误的原因是什么?

1 个答案:

答案 0 :(得分:1)

这是一个编译(汇编)时间错误,而不是运行时错误。 loop指令只有跳转目标的8位有符号偏移量,汇编器试图告诉您目标超出范围。您应该将loop替换为dec ecx; jnz .L24(出于优化目的,建议将其推荐)。