Прочитать из стека внутри подпрограммы реально же?
Всем добра. Читаю книжку по AVR, конспектируя по тихому. Так вот дошел до описания указателя стека. Там есть такая цитата - "Если записать данные в стек и перейти в подпрограмму, то в теле подпрограммы прочитать эти данные будет невозможно. Потому что при вызове подпрограммы текущий адрес из счетчика программ автоматически записывается в стек и при попытке чтения из подпрограммы внутри стека мы извлечем этот адрес и потом не сможем выйти из подпрограммы".
Но ведь я ж могу тупо так сделать в подпрограмме:
push [A]
push [B] ; заталкиваем два 8 разрядных числа в стек
call Spat ; в стек последним зашел адрес вызова этой процедуры
call IdiSrat
Spat:
pop dx ; сохраняем адрес в регистре dx
pop ax ; извлекаем переменную А
pop bx ; извлекаем переменную Б
add ax, bx ; о да, процедура суммирует две 8 разрядных числа из стека))
push dx ; снова заталкиваем адрес в стек
ret ; возвращаемся по адресу и идем спать
Вроде ж можно так сделать или в книге имелось в виду что так делать просто "неправильно"?
а как же принцип стека - "последний зашел, первый вышел"? Это ж получается тогда не стек, а массив какой-то. Я еще не дошел до темы про чтение из стека со смещением) пока в моих примерах попы да пушы)
а как же принцип стека - "последний зашел, первый вышел"?
lutokris, этот принцип применяется к вызываемым функциям. Никто не запрещает брать указатели на данные лежащие в стеке и передавать их как параметры функций.
jcmvbkbc, спасибо, теперь уже понятнее стало. И я правильно понимаю так как код выполнения и стековые данные лежат в одной программной памяти, можно столько записать в стек что перезапишется область кода? И поэтому контроль перезаполнения стека должен реализовать сам программист. И вроде не все ж контроллеры имеют оперативную память, соответственно возможна следующая ситуация - допустим у меня есть сейф с парой лимонов и с кодовым замком на базе микроконтроллера, клавиатуры и реле.
И если я приделаю к микроконтроллеру клавиатуру для получения кода от пользователя и напрямую запихаю все эти полученные данные в стек то возможно ситуация что пользователь может взять и хакнуть микроконтроллер методом "переполнения буфера" и открыть мой сейф?) хотя наверное это уж очень сложна)
И я правильно понимаю так как код выполнения и стековые данные лежат в одной программной памяти, можно столько записать в стек что перезапишется область кода?
В принципе возможна организация памяти, в которой это можно сделать. Но в большинстве ОС с защитой памяти исполняемый код делают доступным только для чтения, так что нужны какие-то дополнительные действия для реализации этого сценария.
И если я приделаю к микроконтроллеру клавиатуру для получения кода от пользователя и напрямую запихаю все эти полученные данные в стек то возможно ситуация что пользователь может взять и хакнуть микроконтроллер методом "переполнения буфера" и открыть мой сейф?