#assembly #x86
#сборка #x86
Вопрос:
Я изучаю сборку (x86 NASM) в университете. Излишне говорить, что я крайне смущен и мало что понимаю. Мы недавно узнали о литтл-энде, так что мы в самом начале.
Во время лекции наш профессор сказал, что мы должны быть осторожны при работе со стеком, мы должны помнить о литтл-энде. Я действительно не понимаю, почему это так. Мой вопрос: соответствует ли стек также соглашению о малых порядках? Я попытался увидеть это в отладчике, и, судя по тому, что я увидел, я думаю, что стек на самом деле не соответствует соглашению о младшем конце, что для меня не имеет смысла, я ожидал, что стек также будет в младшем конце, как и шестнадцатеричный дамп. Я надеюсь, что следующий пример может проиллюстрировать, что я имею в виду:
- Допустим, я помещаю в регистр
EAX
значение12345678h
. Он сохраняется так же, как я его написал, т. Е. Он сохраняется как12345678
. Таким образом, он не сохраняется с использованием соглашения о младшем конце. Здесь нет ничего удивительного, я ожидал этого.
- Вот мое замешательство. Теперь я поместил значение из регистра
EAX
в стек. Я полностью ожидал, что он будет сохранен с использованием соглашения о малых порядках. Поэтому я ожидал, что он будет сохранен в стеке как78563412
, но, к моему удивлению, он хранится не так. Он хранится точно так же, как он хранится в регистреEAX
, поэтому я склонен полагать, что стек не соответствует соглашению о малых порядках.
- Просто чтобы вернуть себе немного здравомыслия, я также переместил значение регистра
EAX
вdword
переменную с именемa
. Это действительно было сохранено в литтл-энде. Здесь тоже нет ничего удивительного, я полностью ожидал этого.
Итак, вы видите, моя проблема в пункте (2) из приведенного выше. Почему значение регистра не сохраняется в стеке с использованием соглашения о младшем конце? Это то, чего я на самом деле ожидал. Могу ли я сделать вывод, что стек не соответствует соглашению о младшем конце? Если да, то что имел в виду мой профессор, когда сказал, что нам нужно помнить о литтл-энде при работе со стеком?
Комментарии:
1. Дамп стека с правой стороны уже отменяет младший конец, чтобы вы были более удобочитаемыми. Это особенность вашего отладчика. Если вы посмотрите на дамп байтов так же, как вы это делали для раздела данных, все будет в порядке.
2. Перейдите в ячейку памяти 19FF70 и проверьте, она будет в младшем конце.
3. @Jester Ооооо, я вижу. Это имеет смысл, я просто не знал, что стек автоматически отменяет младший конец. Большое вам спасибо!
4. @tkausl Да, теперь я понял. Большое спасибо!