Прыжок не работает

В настоящее время я занят созданием небольшого (с пока фиксированными вопросами) теста в сборке (AT&T).

Я разработал небольшое меню, которое запрашивает определенный ввод 1 1 или 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 ответ

  • Вы не выделяете место в стеке для результата от scanf. Вам нужно либо поместить какое-то значение dword в стек, прежде чем передавать аргументы в scanf, либо удалить addl $4,(%esp) и использовать пространство, ранее занятое аргументом для printf. Адрес этого пространства будет -12(%ebp) в системе Windows. Вместо того, чтобы использовать ebp, который вы получаете от операционной системы, я бы посоветовал вам установить его в начале своей программы, чтобы вы знали, на что он указывает.

  • Вы извлекаете два значения из стека, но поскольку у scanf есть два аргумента, значение, которое вы ищете, является третьим значением, поэтому вам нужно вспомнить еще раз.

Другие вопросы по тегам