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 で終了しました。中止されました。
0 0xb7727424 in __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 のみ) を使用したことはありません。私はいくつかの調査を行い、いくつかのことを試してきましたが、私はそれを理解しているようです.