0

使用 GNU 汇编器我试图调用 malloc 来创建一个 C 结构,将值插入该结构并返回一个指向该结构的指针。下面是结构:

struct node {
    void     *next;     
    void     *last; 
    char     *name;     
    int      id;        
    uint8_t  number;
    uint8_t  numberTwo;
    uint8_t  numberThree;
    uint8_t  numberFour;
}

下面是我正在使用的 GNU 程序集:

    push %ebp
    movl %esp, %ebp
    subl $0x1c, %esp
    #movl $20, (%esp)   #I've tried this but it doesn't seem to help
    push $20            #Struct is 20 bytes
    call malloc     
    test %eax, %eax
    jz allocateFailed
    jmp allocateOK

allocateFailed:
    leave
    ret

allocateOK:
    movl 8(%ebp), %edx
    movl %edx, 8(%eax)
    movl 12(%ebp), %edx
    movl %edx, 12(%eax)
    leave
    ret

我已经更新了代码以远离使用 %ebx 寄存器,并查看了汇编程序如何处理此函数的 Objdump。

我得到的参数很好,但是当我尝试将它们放入新创建的结构中时,我得到了一个段错误。下面是核心转储。

程序以信号 6 终止,Aborted。
0 0xb7727424 在 __kernel_vsyscall ()

下面是我在 gdb 中运行回溯得到的结果:

0  allocateOK () at new_student.s:25
1  0x00000014 in ?? ()      #Not sure what this is coming from
2  0xb7fc5a20 in ?? () from /lib/i386-linux-gnu/libc.so.6
3  0x080485ed in test ()    #function that calls and passes in the parameters
4  0x080487b4 in main ()

我还用 C 语言编写了这个函数,并使用 --gstabs 和 -o 进行编译,并使用 objdump 来查看它。我似乎很接近我的,但我似乎无法弄清楚。

sub    $0x1c,%esp
movl   $0x14,(%esp)
call   8048350 <malloc@plt>
mov    0x20(%esp),%edx
mov    %edx,0xc(%eax)
mov    0x24(%esp),%edx
mov    %edx,0x8(%eax)

任何帮助是极大的赞赏。我从未使用程序集(仅 C)来创建和使用结构。我做了一些研究并尝试了一些事情,但我似乎明白了。

4

1 回答 1

0

最佳猜测:由于您在使用%ebx时没有保存和恢复它,因此您正在破坏调用者在其中的某些内容,从而在您的例程返回后导致问题。此外,您只是设置新分配的结构的nameandid字段;其余的将包含未初始化的垃圾。使用调试器获取中止发生位置的堆栈跟踪。

于 2012-10-10T04:14:35.670 回答