В данный момент занят сборкой и столкнулся со следующей проблемой:
Я пытаюсь получить число, которое было введено в регистр eax. Сначала я представляю строку, которая запрашивает ввод, а затем кто-то должен ввести число.
Я использовал следующий код, но я не понимаю его до конца. Обратите внимание на комментарии в коде.
Я знаю, что сейчас с номером абсолютно ничего не происходит, кроме того, что он был перемещен в eax. Что я действительно хочу знать, так это то, почему я должен использовать leal: почему и что он делает? и зачем мне возвращать eax обратно в стек?
.text
string1: .asciz "Please enter a number\n"
input: .asciz "%d"
.global main
main:
# Editor's note: this code is broken / unsafe; missing push %ebp here
movl %esp, %ebp
push $string1 # prompt string
call printf #print the string
# no add $4, %esp here: 4 bytes still allocated on the stack
leal -4(%ebp), %eax # ????
pushl %eax # the thing you pushed in eax is now pushed on the stack?
pushl $input #the number
call scanf
popl %eax
popl %eax # the number that has been entered is now in eax
call end
end:
push $0
call exit
push %esp
может заменить этиlea
/push %eax
, потому что ESP указывает на 4 байта, зарезервированных первымpush $string1
. Нет необходимости использовать указатель кадра, поэтому сломанныйmov %esp, %ebp
можно удалить. (Не работает, потому что вы не сохраняете/восстанавливаете EBP, но в стандартных соглашениях о вызовах он сохраняется). - person Peter Cordes   schedule 19.02.2021