2012-06-05 47 views
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 
+0

您在調試時看到了什麼? – zmbq

+0

當我調試je得不到執行,所以程序移動到下一個cmpl。在這裏它不會被再次擊中,從而達到執行(無條件)執行的調用退出。 – Gooey

+0

當您從鍵盤輸入「1」時,該值爲31h或49十進制,而不是1. –

回答

1
  • 你是不是從scanf函數結果在堆棧上分配空間。在將參數推送到scanf或刪除addl $4,(%esp)並將參數先前佔用的空間用於printf之前,您需要將某個雙字值推入堆棧。在Windows系統上,此空間的地址爲-12(%ebp)。不要使用從操作系統獲得的ebp,我建議你自己在程序的開始部分設置它,以便知道它指向的地方。

  • 您從堆棧中彈出兩個值,但由於scanf有兩個參數,所以您的值是第三個的值,所以您需要再次彈出一個值。

+0

嗯,我稍後再說。我會讓你知道,如果它是任何成功的 - 感謝回答任何方式:) – Gooey