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,而是在程序的开头自行设置它,以便您知道它指向的位置。

  • 您从堆栈中弹出两个值,但由于 scanf 有两个参数,您所追求的值是第三个值,因此您需要再次弹出。

于 2012-06-06T12:42:22.320 回答