Организация программы - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д