ebp
push $0 // counter
counter: -4(esp)
ассемблер ругается:
> Error: junk at end of line, first unrecognized character is `-'
есть ли способ сохранить значение локальной переменной в метку не используя регистры?
Стикер
Есть. push/pop.
то есть просто в голове держать отрицательный отступ для каждой локальной переменной? 🤯
Я не совсем понял, чего именно ты хочешь добиться. Но если ты хочешь локальные переменные с человеческими именами, у тебя есть ebp (кадр стека ты уже создал), адресация относительно ebp не зависит от push/pop, а чтобы не запоминать смещение, у тебя есть .set.
да, в своём примере я esp и ebp перепутал в последней строчке про .set почитаю, спасибо а как добиться человеческого имени для этой локальной переменной по -4(%ebp) ?
В нормальных асмах есть locals, proc. На крайний случай, equ, но это уже некрасиво. Глянь, есть ли это в GAS.
.set MYVAR,-4 movl %eax,MYVAR(%ebp) Ну и sub $4,%esp в прологе
Не уверен, что для gas вообще есть proc-макросы. Ну то есть, возможность писать макросы там, конечно, есть, но я никогда ничего сложного на них не видел.
а в прологе разве нужно вычитать из esp если в leave уже есть mov ebp, esp pop ebp ?
Это эпилог. Классический пролог — это создание стекового кадра и резервирование места под локальные переменные: push ebp/mov ebp,esp/sub esp,locals_size.
перепутал слово эпилог и пролог в своём вопросе, голова уже под вечер того
Обсуждают сегодня