Работа со стеком
Posted: Mon Sep 19, 2011 1:20 am
В свое время я был наивным начинающим программистом на ассемблере х86 (впрочем и сейчас не шибко далеко ушел).
Я был в плену двух заблуждений:
1) Стек растет вверх.
На самом деле он растет вниз в сторону уменьшения адресов. Кстати вот тут можно почитать немного http://avtehnika.ru/content/view/477/33/
2) Стек можно размещать только в конце программы.
П.2 логически проистекал из п.1
На самом деле стек можно размещать где угодно в программах Колибри.
Мои заблуждения проистекали из нередких заголовков в программах для Menuet, например:
Зачем было выделять программе использующей менее 4 Кб памяти целых 16 Мб (ШЕСТНАДЦАТЬ!) и ставить указатель стека в середину выделенной памяти, для меня так и осталось загадкой. Впрочем оставим это на совести оригинального автора, имевшего свое особое видение - как надо разрабатывать программы.
Сейчас же меня интересует другой вопрос:
Много раз встречаю, что указатель стека устанавливается не на ровную границу, а на границу и -1 байт. Казалось бы область для стека выровнена на границу 4 байта и это идеально, но почему же люди сдвигают на 1 байт назад? Может есть какая-то особая уличная магия и я ее не знаю? Или есть в тонкостях документации что-либо по этому поводу. Я прошу тех кто в курсе прояснить ситуацию.
Я не наблюдаю никакой падучести программы при например такой установке:
Хотя явное указания адресов мешает сопровождать и писать программу, так что следующее указание лучше:
Я был в плену двух заблуждений:
1) Стек растет вверх.
На самом деле он растет вниз в сторону уменьшения адресов. Кстати вот тут можно почитать немного http://avtehnika.ru/content/view/477/33/
2) Стек можно размещать только в конце программы.
П.2 логически проистекал из п.1
На самом деле стек можно размещать где угодно в программах Колибри.
Мои заблуждения проистекали из нередких заголовков в программах для Menuet, например:
Spoiler:
Code: Select all
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd 0x1000000 ; memory for app
dd 0x7FFFFFF ; esp
dd 0x0,0x0 ; I_Param , I_Icon
Сейчас же меня интересует другой вопрос:
Много раз встречаю, что указатель стека устанавливается не на ровную границу, а на границу и -1 байт. Казалось бы область для стека выровнена на границу 4 байта и это идеально, но почему же люди сдвигают на 1 байт назад? Может есть какая-то особая уличная магия и я ее не знаю? Или есть в тонкостях документации что-либо по этому поводу. Я прошу тех кто в курсе прояснить ситуацию.
Я не наблюдаю никакой падучести программы при например такой установке:
Spoiler:
Code: Select all
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd 0x20000 ; memory for app
dd 0x20000 ; esp
dd 0x0,0x0 ; I_Param , I_Icon
Spoiler:
Code: Select all
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd IM_END ; size of image
dd I_END ; memory for app
dd stacktop ; esp
dd temp_area ; I_Param
dd path ; APPLICATION PACH