跳不起来

时间:2012-06-05 10:34:39

标签: assembly att

我目前正在忙于在装配(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

1 个答案:

答案 0 :(得分:1)

  • 您没有在堆栈上为 scanf 的结果分配空间。在将参数推送到 scanf 之前,您需要将一些dword值推送到堆栈,或者删除addl $4,(%esp)并使用先前由参数占用的空间 printf 。在Windows系统上,此空间的地址为 -12(%ebp)。我建议你不要使用从操作系统获得的ebp,而是在程序的开头设置它,以便你知道它指向的位置。

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