2

私は現在、アセンブリ (AT&T) で小さな (これまでのところ固定された質問がある) クイズを作成するのに忙しくしています。

1 2 または 3
のいずれかの特定の入力を要求する小さなメニューを設計しました。問題は、私の cmpl が機能しないことであり、その理由がわかりません。入力が何であれ、ただ終了します。

以下は私のコードの一部です:

.text

menu: .asciz "Please select an option: 1 - Start the quiz! 2 - Highscores 3 - Quit\n"
input: .asciz "%i"

.global main

main:
    call menushow

menushow:
    push $menu
    call printf
    addl $4,(%esp)

    leal -4(%ebp), %eax 
    pushl %eax
    pushl $input

    call scanf      

    popl %eax
    popl %eax       # the number that has been entered is now in eax

    cmpl $1,%eax        #1 entered? 
    je qone         #show question 1

    cmpl $2,%eax        #2 entered??
    je showHighScores   #show current highscores

    call quit       #something else? (3, 99 w/e) then we quit
4

1 に答える 1

1
  • scanfの結果のためにスタックにスペースを割り当てていません。引数をscanfにプッシュする前に、いくつかの dword 値をスタックにプッシュするか、 を削除して、addl $4,(%esp)以前に引数が占めていたスペースをprintfに使用する必要があります。このスペースのアドレスは、Windows システムでは-12(%ebp)になります。オペレーティング システムから取得した ebp を使用する代わりに、プログラムの開始時に自分で設定して、それがどこを指しているかがわかるようにすることをお勧めします。

  • スタックから 2 つの値を取り出しますが、scanf には 2 つの引数があるため、求める値は3 番目の値であるため、もう一度ポップする必要があります。

于 2012-06-06T12:42:22.320 に答える