1

アセンブリ ルーチンによって変更される予約バイトがあります。

私はpusha/* 仕事をしました */を使用してpopaいましたが、セグメンテーション違反が発生します。

pushaandpopapush eax push ecx/* do my job */に置き換えると、正常にpop ecx pop eax動作します。

しかし、なぜこのセグフォルトが発生するのでしょうか? との関係はpusha

以下は私のコードの一部です。ここでは、8 つのレジスタのうち 2 つだけを使用します。ルーチンで 8 を使用する必要がある場合、各レジスタをプッシュ アンド ポップする必要がありますか? バフを維持する以外に方法はpushaありませんか?popa

main:
   pusha
    mov eax,10
.AGAIN:
    cmp eax,0
    je .END
    mov [buf + ecx],'.'
    inc ecx
    dec eax
    jmp .AGAIN
.END:
    mov [buf + ecx],0
    mov ebp,buf
    call puts
    popa
    ret

seg fault を与えないでください:

main:
    push eax
    push ecx
    mov eax,10
.AGAIN:
    cmp eax,0
    je .END
    mov [buf + ecx],'#'
    inc ecx
    dec eax
    jmp .AGAIN
.END:
    mov [buf + ecx],0
    mov ebp,buf
    call puts
    pop ecx
    pop eax
    ret

bufは次のように定義されます。

セグメント読み取り可能書き込み可能
buf rb 12

4

1 に答える 1

2

Pusha/popa は、16 ビット レジスタ (AX、BX、CX、DX、SP、BP、SI、DI) を保存します。32 ビット レジスタ EAX と ECX を変更しているので、同等の 32 ビットを使用してください: pushad と popad。

于 2013-02-05T06:03:30.107 に答える