Вопрос № 147380: Здравствуйте! Никак не могу понять, каким образом пишутся программы длиной более 64 кБт. Вот посмотрите в примере – допустим, в программном коде понадобилось совершить дальний прыжок (ну и т.д.: вызвать подпрограмму, вернуться из нее..). <br...
Вопрос № 147.380
Здравствуйте! Никак не могу понять, каким образом пишутся программы длиной более 64 кБт. Вот посмотрите в примере – допустим, в программном коде понадобилось совершить дальний прыжок (ну и т.д.: вызвать подпрограмму, вернуться из нее..).
Отвечает: Командин Константин Евгениевич
Здравствуйте, Бартосик Феликс Михайлович! Вы выбрали .model small
Small (малая). Эта модель хорошо подходит для небольших прикладных программ. Сегменты кода и данных расположены отдельно друг от друга и не перекрываются, что позволяет иметь 64К кода программы и 64К данных и стека. Используются только указатели near.
И объявляете резервируете память db 5000h dup (99h) db 0f000h dup (99h) что в сумме больше 64 кб. (около 81кб если быть точнее) следовательно либо вам нужно уменьшить резервируемую
память либо использовать другую модель памяти. Напрмер # Medium (средняя). Эта модель годится для больших программ, для которых не требуется держать в памяти большой объем данных. Для кода, но не для данных используются указатели far. В результате данные плюс стек ограничены размером 64К, а код может занимать до 1М. # Compact (компактная). Лучше всего использовать эту модель в тех случаях, когда размер кода невелик, но требуется адресация большого объема дан
ных. Указатели far используются для данных, но не для кода. Следовательно, код здесь ограничен 64К, а предельный размер данных - 1 Мб. # Large (большая). Модели large и huge применяются только в очень больших программах. Дальние указатели используются как для кода, так и для данных, что дает предельный размер 1 Мб для обоих. # Huge (огромная). Дальние указатели используются как для кода, так и для данных. Borland C++ обычно ограничивает размер статических данных 64К; модель памяти huge отменяет это ограничение,
позволяя статическим данным занимать более 64К.
Ответ отправил: Командин Константин Евгениевич (статус: 4-ый класс)
Ответ отправлен: 16.10.2008, 09:49 Оценка за ответ: 5 Комментарий оценки:
Здравствуйте Константин Евгениевич!
Почему то ни с одной из указанных Вами моделей памяти, ничего не получилось - сообщение об той же ошибке.
Может я что-то не так делаю..
Однако Вы меня натолкнули на мысль о сегментах - я переделал код нижеследующим образом - ВСЕ ПОЛУЧИЛОСЬ.
CCC SEGMENT
ORG 100H
BEGIN:
; ##############################
JMP perehod
db 5000h dup (88h)
; ##############################
CCC ENDS
ddd SEGMENT
db 0f000h dup (99h)
perehod proc far
perehod endp
ddd ends
END BEGIN
Конечно извращенно выглядят пустые строчки:
perehod proc far
perehod endp
Но я так и не понял с какой стороны к метке дописывать атрибут FAR, а без него конечно ошибка.
Ну и машинные коды выглядят должным образом:
1405:0100 EA00F01105 JMP 0511:F000
или допустим так (если CALL perehod):
1405:0100 9A00F01105 CALL 0511:F000
Спасибо!
Отвечает: Airyashov
Прочитайте про другие модели пямяти, если используете упрощенное определение сегментов.
Ответ отправил: Airyashov (статус: 9-ый класс)
Ответ отправлен: 16.10.2008, 13:37 Оценка за ответ: 5 Комментарий оценки:
Здравствуйте : Airyashov!
Я не совсем понимаю термин "упрощенное определение сегментов", но я переделал свой кривой пример, который заработал. В оценку к Командину Константину Евгениевичу его вставил, но там он криво (все в одну строку), лучше еще раз на мини-форум закину.
А вот с моделями памяти ничего не выходит. По крайней мере с теми, что мне предыдущий эксперт посоветовал.