Организация программы - Assembler
Формулировка задачи:
Добрый день! Маленький вопрос по поводу организации программы: я создал программу, состоящую из 3х сегментов: стека, кода и данных. Стартовую метку разместил в сегменте кода. Возникли сомнения: а вдруг сегмент стека, который я организовал до сегмента кода, будет игнорироваться компилятором (ведь начальная метка идет после него). Непонятно также где стоит ставить end, до начала сегмента данных или после? И если после, то, на мой взгляд, получается нелогичным, что данные и код находятся между началом и концом, а стек находится за пределами.. На всякий случай прилагаю модель кода:
LS segment STACK
db 100h dup(?)
LS ends
LC segment
assume ss:LS, cs:LC, ds:LD, es:LD
LC ends
LD segment
LD ends
end LP
В общем, углубившись в раздумья, я понял, что мой вопрос полная ерунда, так как моя проблема значительно глобальнее.. Я абсолютно не понимаю принципа работы exe программ.. В связи с этим очень прошу вас разъяснить мне:
1)Сегмент стека мы заводим отдельно. Как сделать так, чтобы командой push в него заносились значения, а командой pop извлекались?
2)У меня почему-то не работает функция 4с00h. Когда программа подходит к ней, она просто повисает. Отладчик показывает, что программа чего-то ждет, а иногда заявляет, что опкод - инвалид..
В общем чертовщина какая-то! Так и тянет к родным комкам, но стиснув зубы держусь!)
Решение задачи: «Организация программы»
textual
Листинг программы
seg001:0000 start: seg001:0000 mov ds, ax seg001:0000 ; --------------------------------------------------------------------------- seg001:0002 assume ds:nothing seg001:0002 db 0Eh dup(0), 1 seg001:0002 seg001 ends
Объяснение кода листинга программы
- Устанавливается точка входа программы с меткой
start. - Загружается значение регистра
axв регистр данныхdsс помощью командыmov ds, ax. Переменнаяdsсодержит селектор сегмента данных. - Описывается сегмент памяти
seg001с начальным адресом0000и конечным адресом0002. - Загружается значение
nothingв регистрdsс помощью командыassume ds:nothing. Названиеnothingможет быть ссылкой на другой сегмент или подразумевать, что значениеdsне используется в данном сегменте. - Описывается массив байт
db, который содержит 15 нулевых байтов и один байт со значением1. - Завершается описание сегмента
seg001.