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

4

1 に答える 1

0

最良の推測:%ebx保存して復元せずに使用しているため、呼び出し元が持っていたものを破損しており、ルーチンが戻った後に問題が発生しています。また、新しく割り当てられた構造体のフィールドnameとフィールドのみを設定しています。id残りには、初期化されていないガベージが含まれます。デバッガーを使用して、アボートが発生した場所のスタック トレースを取得します。

于 2012-10-10T04:14:35.670 に答える