Здравствуйте уважаемые Гуру! Столкнулся с проблемой создания нескольких сегментов в программе (пишу в DOS, Turbo Assembler). Пишу примерно следующие: Код (Text): .model large,c locals .data segment BUFFER1 para use16 db 0FFFFh dup(0FFh) ends segment BUFFER2 para use16 db 0FFFFh dup(?) ends segment Table para 'DATA' db 1024 dup(?) ends segment SSEG para stack 'STACK' db 0FFFFh dup(?) ends .code .386 ..... После этого смотрю BUFFER1, он оказывается заполненным 0FFh не полностью. Работая с этими массивани происходит потеря данных. Если же беру 1 сегмент размером менее 64 кб все роботает нормально. Укажите пожалуйста на проблему.
kot-begemotik Какая версия TASM'а? Например, tasm v3.1 не позволяет в качестве имени сегмента использовать слово Table, поэтому твой код не компилирует. оказывается заполненным 0FFh не полностью Сколько не заполнено? Программно заполнять не пробовал? Работая с этими массивани происходит потеря данных. Код весь твой?
Версия tasm 3.1. Писал как помнил, в программе этой проблемы нет, т.е. там название таблицы другое. Заполнено 19000 - 19456 байт. Программно заполнять пробовал эффект тот же. Странно то, что если объем всех данных в программе < 64 кб, то все работает нормально..
Тоесть даже если я объявляю один сегмент размером 64 кб, т.е. объем данных в программе становится больше 64 кб. Код (Text): segment BUFFER1 para use16 db 0FFFFh dup(0FFh) ends Программа уже перестает работать корректно.
kot-begemotik Писал как помнил Если хочешь получить помощь, давай полную и достоверную информацию. Заполнено 19000 - 19456 байт. Как ты это определяешь? Покажи как заполняешь. перестает работать корректно Если код полностью твой, то проблемы на твоей совести, трудно что-либо подсказать, если не видно кода. Чтобы не быть голословным, написал программу Код (Text): .model large,c segment BUFFER1 para use16 db 0FFFFh dup(0FFh) ends segment SSEG para stack 'STACK' db 0FFFFh dup(?) ends .code .386 start: mov ax,seg BUFFER1 mov es,ax mov ax,4C00h int 21h end start собрал exe'шник (tasm v3.1, tlink v5.1 все из bc++v3.1). Внутри вижу Код (Text): 0000000000: 4D 5A 0F 00 82 00 01 00 20 00 00 10 FF FF 01 10 0000000010: FF FF 00 00 00 00 00 00 3E 00 00 00 01 00 FB 50 0000000020: 6A 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 ... 00000001F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000200: B8 01 00 8E C0 B8 00 4C CD 21 00 00 00 00 00 00 0000000210: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ... 00000101F0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0000010200: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF Открываю в td.exe, выполняю две команды и в Dump-окне вижу Код (Text): es:0000 FF FF FF FF FF FF FF FF es:0008 FF FF FF FF FF FF FF FF ... es:FFF0 FF FF FF FF FF FF FF FF es:FFF8 FF FF FF FF FF FF FF 00 Имхо все 0FFh на месте.
q_q Спасибо! Вот посмотри на вот эту программу, создает таблицу в которую записываются адреса двух областей данных по 64кб, одна из которых заполнена 0FFh. Все ли в ней верно? В частности, если я исползую объем данных >64кб, как правильно описать стек? Код (Text): .model large,c .data error db 0 segment BUFFER1 para use16 db 0FFFFh dup(0FFh) ends segment BUFFER2 para use16 db 0FFFFh dup(?) ends segment PH_Addr para 'DATA' db 100h dup(?) ends segment SSEG para stack 'STACK' db 0FFFFh dup(?) ends .code .386 start: mov ax,PH_Addr mov es,ax xor eax,eax mov ax,BUFFER1 shl eax,4 mov [es:0],eax xor eax,eax mov ax,BUFFER2 shl eax,4 mov [es:4],eax mov ax,4C00h int 21h end start
kot-begemotik записываются адреса двух областей ... Все ли в ней верно? Afaik под dos принято хранить адрес как пару word'ов - seg:off или только seg (адрес параграфа), если off равно нулю. Ты сохраняешь 20-ти битные адреса - это не проблема, только как ты их потом используешь? как правильно описать стек? Твой вариант жизнеспособен.