Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 1091
от 21.10.2008, 19:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 288, Экспертов: 18
В номере:Вопросов: 1, Ответов: 2

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 147380: Здравствуйте! Никак не могу понять, каким образом пишутся программы длиной более 64 кБт. Вот посмотрите в примере – допустим, в программном коде понадобилось совершить дальний прыжок (ну и т.д.: вызвать подпрограмму, вернуться из нее..). <br...

Вопрос № 147.380
Здравствуйте!
Никак не могу понять, каким образом пишутся программы длиной более 64 кБт.
Вот посмотрите в примере – допустим, в программном коде понадобилось совершить дальний прыжок (ну и т.д.: вызвать подпрограмму, вернуться из нее..).


Компилятор просто напросто выдает сообщение:
C:TempAsmAsmEditproba1.asm(23): error A2103: segment exceeds 64K limit : _T
EXT

Пользуюсь:
Macro Assembler Version 6.11
Microsoft (R) Segmented Executable Linker Version 5.31.009 Jul 13 1992

Приложение:

Отправлен: 16.10.2008, 08:26
Вопрос задал: Бартосик Феликс Михайлович (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Командин Константин Евгениевич
Здравствуйте, Бартосик Феликс Михайлович!
Вы выбрали .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! Я не совсем понимаю термин "упрощенное определение сегментов", но я переделал свой кривой пример, который заработал. В оценку к Командину Константину Евгениевичу его вставил, но там он криво (все в одну строку), лучше еще раз на мини-форум закину. А вот с моделями памяти ничего не выходит. По крайней мере с теми, что мне предыдущий эксперт посоветовал.


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале

∙ Версия системы: 5.6 от 14.10.2008

Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru
RusIRC.ru | Kalashnikoff.ru | RadioLeader.ru

В избранное