[__var] вернет адрес на _var, а нужно еще [_var], что бы получить var, тоесть [[__var]]. В __var храниться адрес _var, а уже в нем хранится адрес на var, в котором и храниться значение. Немного криво назвал переменные, сам путаюсь
ПРОБЛЕМА РЕШЕНА И снова я.
Программа на фасме, размером в 3кб(бинарник) и больше не хочет запускаться. А еолайт даже пишет почему: "Error #31 File is not executable".
А мне позарез нужно запихнуть туда 7 кб.
Самое странное - код успешно компилируется, создаётся бинарник, а вот запускаться не хочет. Никаких ошибок в BOARD не пишет (не в user, не в kernel).
Прилагаю рабочий код, но если в этом коде убрать ";" у любой строки в конце типа ' file "icons/..." '. Как исправить или как увеличить допустимый размер бинарника?
db 'MENUET01'
dd 0x01, __START, __END, __MEMORY, __MEMORY, ...
...
_START:
...
; инициализированные данные
db 0
__END: ; эта метка должна быть сразу после всех инициализированных данных
; неинициализированные данные
...
; резервируем место для стека; помним, что невыровненный стек - сильный удар по производительности
align 4
rb 1024 ; пока нет сложных цепочек вызовов, 1 Кб должно хватать
__MEMORY:
Т.е. указатели на начало области стоят, а нужно их на конец области ставить. В твоем случае в char copy_stak[4096] вообще без всякой пользы пропадает 4 Кб ОЗУ. Не то чтобы они не нужны, но они ну совсем никак не используются.
Спасибо за ссылку. Я действительно не понимаю. Сейчас буду читать. Spoiler:Вообще нормальная книга по асму у меня в плане прочтения, но к сожалению после
- книги по HTML на 760 страниц , которую я сейчас читаю
- книги по сертификации тестировщиков
- книги по экстремальному программированию
+ вот тут уже будет ассмеблер и затем книга по строению ОС.
Leency wrote:Прочитал. Т.е. правильно писать не CreateThread(#about_dialog,#about_stak);
а CreateThread(#about_dialog,#about_stak+512); //512 - размер стека
?
Да.
Spoiler:Ответ в стиле нашего Анонимного Анонимуса.
Но теоретически лучше, 512-4, чтобы наверняка не попасть на чужую сиську.
Spoiler:Хотя сам я лентяй и так не делаю, хотя зря я так не делаю.
Leency wrote:Также, если по-простому, то размер стека определяет максимальное количество push'ов без pop'ов в программе?
Нет.
Если стек не используется для хранения дополнительных данных (а компиляторы ЯВУ часто любят делать ESP - X dword и запихивать свои данные в стек, например локальные переменные и возможно массивы), то максимальная вложенность push, которая присутствует в коде. Еще push'и разные бывают, к примеру pusha или pushad, которые ловким движением отправляют содержимое нескольких регистров в стек. В общем лучше перебдеть со стеком, чем недобдеть - 640 Кб 4 Кб обычно достаточно, экспериментальным путем можно уменьшить размер. Стеки дополнительных потоков это абсолютно такие же стеки как и стек основного потока, который их породил.