使用 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)来创建和使用结构。我做了一些研究并尝试了一些事情,但我似乎明白了。