Организация программы - 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

Объяснение кода листинга программы

  1. Устанавливается точка входа программы с меткой start.
  2. Загружается значение регистра ax в регистр данных ds с помощью команды mov ds, ax. Переменная ds содержит селектор сегмента данных.
  3. Описывается сегмент памяти seg001 с начальным адресом 0000 и конечным адресом 0002.
  4. Загружается значение nothing в регистр ds с помощью команды assume ds:nothing. Название nothing может быть ссылкой на другой сегмент или подразумевать, что значение ds не используется в данном сегменте.
  5. Описывается массив байт db, который содержит 15 нулевых байтов и один байт со значением 1.
  6. Завершается описание сегмента seg001.

Оцени полезность:

7   голосов , оценка 4 из 5