3

クラスの単純なアセンブリ プログラムを作成していて、奇妙なセグメンテーション エラーが発生しています。バイトをキロバイトに変換する非常に単純なプログラムです。ebxただし、変換を行う関数内で、値 1024 をレジスタに移動しようとすると、セグメンテーション違反が発生します。レジスタを操作するときに、この種の問題が発生したことはありません。誰かがこれを引き起こしている可能性があることを知っていますか? 私が見落としているのは単純なものだと思います。ありがとうございました!

asm_main:
    enter 0,0
    pusha

    mov eax, 0
    mov ebx, 0
    call read_int
    push eax
    call functionA

    popa
    mov
    leave
    ret
functionA:
    mov eax, [esp + 4]
    call print_int
    call print_nl
    mov ebx, 1024 ;segmentation fault occurs here
    div ebx
    call print_int
    ret

更新: 興味深い発見の 1 つは、スタックと対話する行を削除するpush eaxmov eax, [esp + 4]、セグメンテーション違反がなくなることです。しかし、eax実行した後、私はクレイジーな結果を得るdiv ebx.

4

1 に答える 1

4

コメント十分!cHao には申し訳ありませんが、悪いとセグメンテーション フォールトでdivはなく、例外が発生します。グレートウルフが言うように、スタック ポインタは foobar されます... パラメータをfunctionA削除せずにプッシュすることによって。私は最初の読み飛ばしでそれを逃しました。

%include "asm_io.inc"
asm_main:
enter 0,0
pusha

mov eax, 0
mov ebx, 0
call read_int
push eax
call functionA
add esp, 4 ; or pop something to remove the parameter
popa
mov eax, 0 ; to return a value to "driver.c"
leave
ret
functionA:
mov eax, [esp + 4]
call print_int
call print_nl
mov ebx, 1024 ;segmentation fault occurs here (??? I doubt it)
xor edx, edx ; "div" is going to use this!
div ebx
call print_int
ret

それはテストされていませんが、大丈夫だと「思います」。read_intetc.のコードは、 http: //www.drpaulcarter.com/pcasm にあります。これは、OSen 間の違いを滑らかにするために scanf (および printf など) を使用するだけです。大丈夫だと思います。

于 2013-11-09T03:51:06.640 に答える