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