| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для начинающих > предел 64к? |
| Автор: котъ 4.12.2005, 13:23 |
| как в общем виде решить такую вот задачу : с микроконтроллера в комп поступают байты данных, но их количество превышает 64к !!!!!!!! В одном сегменте данных программы .com и . exe они не могут разместиться !! Как же их разместить и куда ??? Решаема ли эта задача для реального режима с применением дополнительной памяти в пределах мегабайта ? А если байтов больше чем 1мб ? -- только защищенный режим с применением расширенной памяти ? В какие сегменты в этом случае писать получаемые байты ? СПАСИБО !!!!!! |
| Автор: Akina 4.12.2005, 15:16 | ||||||
Используй нормализацию указателей:
DOS-GW extender |
| Автор: Chingachguk 4.12.2005, 15:18 |
| Ну вообще-то проще всего сохранять данные на диск ;) С трудом представляю себе задачу когда нужно держать ВСЕ данные обязательно в памяти. В общем случае действительно можно использовать обычную память до 1 Мегабайта или функции DPMI. Это (DPMI) несложно, и поддерживается всеми версиями windows, а в случае чистого доса устанавливается простой драйвер (досовский). |
| Автор: Janus 4.12.2005, 18:11 | ||||
| А если нужно работать под чистым досом без дополнительных дров? Что если не использовать файлы? Нужно в память помещать много данных, непрерывно. Как это сделать? Есть что-то вроде этого:
Так вот, программа получается огромной - 2 дополнительных сегмента, каждый по 64 Кб. Как сделать, чтобы можно было написать так:
Но чтобы можно было спокойно использовать по 64 Кб каждого сегмента. Естественно, в начале работы нужно как-то заполнить сегменты значениями(см. код выше). |
| Автор: Akina 4.12.2005, 21:50 |
| с приведенным выше кодом нормализации я спокойно под ДОСом работал с массивом 200-300 кб. Вернее с двумя массивами - 2 устройства синхроно получали данные, их надо было синхронно обрабатывать, но вот передача могда идти несинхронно - вплоть до того что второй массив мог пойти вообще после первого... получать в память была не моя забота, но массивы были от 100 до 160 кб... и их надо было накапливать... я выделял 2 MCB по 160 кб каждый, а обрабатывались они с нормализацией, потому сегнментация не мешала. |
| Автор: Chingachguk 4.12.2005, 22:09 | ||
Ну по поводу "удобной работы без сегментофф" есть много всякого - в том числе "нереальный" режим процессора (по книге Зубкова С.В.):
А вообще-то переключить проц в PM и работать с большими кусками памяти - совсем не сложно |
| Автор: котъ 5.12.2005, 12:12 |
| Всем огромное спасибо !!!! Только я пока имею разряд чайника , но попробую разобраться. Объястите пожалуйста только вот что : а ваще сколько может быть всего сегентов данных по 64к в . exe программе для доса???? - в пределах дополнительной памяти ? а в пределах расширенной? Как их определить - задать в программе??!!!!!!!!!!!!!!!!!!!!! Если не трудно то лучше показать на коротком примере. Или в этом качестве используется дополнительный сегмент es или сегменты? Относительно диска , я понял так , что в процессе набора из МК в комп можно набирать данные по 64к и скидывать последовательно в .dat файлы на диск !????? А затем уж их обрабатывать по отдельности . А что если эти файлы потом слить в один .dat ? и обрабатывать как один общий? И обрабатывать его частями по 64к? |
| Автор: Janus 5.12.2005, 16:46 | ||
А можно в двух словах самую суть? Чего мы этим добились? Или ссылку на статью. |
| Автор: Chingachguk 5.12.2005, 18:37 | ||
Можно. У файла как правило нет ограничений на размер. Открой его и пиши в него сколько хочешь сессий с данными. Или на каждую сессию свой файл. Имхо, тебе не нужно много памяти. |
| Автор: Akina 5.12.2005, 23:15 | ||
Да собственно это просто реализация механизма модели памяти huge. На АСМе. Не более и не менее. Исключение заворота сегмента... статьи, извини, нет. не писАл... |
| Автор: котъ 6.12.2005, 09:34 |
| Уважаемый Chingachguk! попробовал писать в .dat файлы по мере заполнения массива сегмента данных. Все получается ! Действительно можно обрабатывать неограниченные объемы ! Только если тебе не очень трудно , ответь пожалуйста на старые вопросы !!!! а именно : Объясни пожалуйста только вот что : а ваще сколько может быть всего сегентов данных по 64к в . exe программе для доса???? - в пределах дополнительной памяти ? а в пределах расширенной? Как их определить - задать в программе??!!!!!!!!!!!!!!!!!!!!! Если не трудно то лучше показать на коротком примере.!!!!!!!!!!!!!!!!!!! Или в этом качестве используется дополнительный сегмент es или сегменты? Извини за возможно глупые вопросы , но в литературе о них " забывают" писать. СПАСИБО! |
| Автор: oleg1973 6.12.2005, 10:49 | ||
| а не про ще ли сделать FLAT режим (ну это когда предел сегмента в 4 гб в реальном режиме) ? p.s. вот кстати на сайте FASM
http://flatassembler.net/examples.php |
| Автор: Chingachguk 6.12.2005, 15:53 | ||||||||
Сделай команду mem /d /p. Увидишь примерно сколько у тебя памяти может быть. Около 550 000 байт. Число сегментофф ~ 550 000 / 2^16.
Ну если под расширенной понимать то, что после видеопамяти и до (за)BIOS'а (ом) в самых старших адресах, то еще парочка, а если ты про память за 1-м мегом (которая доступна через DPMI), то не менее 16 мегабайт / на размер сегмента.
Какой программе ? com/exe на асме ? Для com сразу выделяется вся память за программой до видеопамяти, можешь сразу отступить от своего начала 64 Килобайта и делать с ней что хочешь. Для EXE зависит от линковки, но можно просто определить несколько сегментов .DATA?, тебе будут доступный они после загрузки.
|
| Автор: котъ 8.12.2005, 13:36 |
| спасибо Chingachguk ! |