Проблема в:
pushl 4(%esp)
Это помещает значение в стек, а не адрес такой переменной.Сравните это с предыдущей правильной инструкцией pushl %esp
.Этот действительно выдвигает адрес.
Вам нужно pushl %esp+4
, но это невозможно сделать только одной инструкцией AFAIK.Вместо этого сделайте что-то вроде:
lea 4(%esp), %eax
push %eax
ОБНОВЛЕНИЕ:
Другая ваша проблема в том, что каждый раз, когда вы выполняете push% esp, уменьшается, поэтому вычисление правильного адреса для ваших локальных переменных является грязным.Это одна из причин иметь фрейм стека, и у вас есть один!Поэтому используйте% ebp для ссылки на ваши локальные переменные, но с отрицательным смещением:
pushl %ebp
movl %esp, %ebp
addl $-8 ,%esp # moving down the stack
lea -4(%ebp), %eax
pushl %eax
lea -8(%ebp), %eax
pushl %eax
pushl $input_format1
call scanf # call scanf to get a number from the user
addl $12,%esp
movl -8(%ebp),%ebx # store the actual number
movl -4(%ebp),%ecx