__kernel_vsyscall 汇编函数 (gdb)

__kernel_vsyscall in assembly function (gdb)

我在提供正确输出的函数中遇到 __kernel_vsyscall 错误,但程序永远无法通过它并给出 __kernel_vsyscall 错误。 C 函数:

void f1(int* input, int* output, int nbElements);

汇编程序函数 (GAS)。我不能 post 整件事,因为这是一项作业,我不想让别人复制它。

f1:
    push %ebp
    mov %esp, %ebp

    movl [=12=], %ecx
    movl [=12=], %ebx

    jmp for_loop1

for_loop1:

    cmpl %ecx, 16(%ebp)
    jb end
    movl [=12=], %ebx
    jmp for_loop2

for_loop2:
    /*move input elements to output elements*/
    cmpl %ecx, %ebx
    jmp incr_2

incr_2:

    addl , %ebx
    cmpl %ebx, 16(%ebp)
    jb incr_1
    jmp for_loop2

incr_1:
    addl , %ecx
    jmp for_loop1

end:        
    addl , %esp               
    leave
    ret

程序终止时出错:

malloc(): invalid size (unsorted)
Aborted (core dumped)

使用带有 coredump 文件的 gdb 进行调试时出错:

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./program_name...
[New LWP 2634]

warning: Loadable section ".note.gnu.property" outside of ELF segments
Core was generated by `./program_name'.
Program terminated with signal SIGABRT, Aborted.
#0  0xf7f35ac9 in __kernel_vsyscall ()

我尝试查看地址 0xf7f35ac9 中的内容,它返回 -402652697 或另一个随机值。

局部变量在0xff83b1fc附近的地址,指针中存储的值在0x80cab30附近的地址,之前声明的函数在0x8049fc4附近的地址,堆栈的值在0xffaddedc附近,所以我不知道这个在哪里是。

谢谢

我可以通过更改

来解决问题
cmpl %ecx, 16(%ebp)
jb end

cmpl 16(%ebp), %ecx
jge end

与所有其他比较相同。上网查了一下,jb/ja 和 jl/jg 的区别是 jb/ja 是无符号比较,而 jl/jg 是有符号比较,但我还是不明白这是为什么导致此错误。