Создано расширение BIOS для PCI-устройства в виде exe-файла (инструмент Turbo Assembler, ver 3.1, MODEL TINY, размер 4К). Его надо превратить в двоичный bin-файл и прошить в ПЗУ. Но!!! стандартный способ получения bin-файла через com-файл не работает. Линкер выдает ошибку и не делает потому что "обнаружил stack segment". Но без стека не получается а и ни одно руководство по Turbo Assembler не запрещает иметь стек в com-файле. Помогите разобраться с проблемой! (форум на эту тему я уже просмотрел и попробывал все предлагаемые варианты). ниже приведен кусок из программы на который ругается линкер: IDEAL P386 LOCALS MODEL TINY CODESEG ORG 0 ;========== PCI ROM Header structure ========== RomSignByte1 DB 055h RomSignByte2 DB 0AAh InitSize DB 010h ;length by units of 512 bytes (?) jmp START ;3 bytes command !!! EntryPointInit DB 3 DUP (?) RsvPciRom DB 12h DUP (?) ;reserved PciDataPointer DW SHORT OFFSET PciSign ; pointer to PCI DATA structure ;====== End of PCI ROM Header structure ======= ;========== PCI DATA structure ============ PciSign DB "PCIR" ;50h,43h,49h,52h VendorIdent DW 0000h DeviceIdent DW 0001h RsvPciData1 DW 0000h ;reserved ;PciDataStrucLenrth DW (OFFSET DevSignPtr)+(SIZE DevSignPtr)-(OFFSET PciSign) PciDataStrucLenrth DW SIZE_PciDataStruc PciDataStrucRev DB 01h DevClassCode DB 01h,01h,080h ImageLength DW 08h ;length by units of 512 bytes RevisionLevel DW 01h Codetype DB 0 ;Intel x86, PC-AT compatible Indicator DB 080h ;bit-7=1:Last image in ROM RsvPciData2 DW 0000h ;reserved DevSignPtr DW 0000h ;pointer to device signature ;========= End of PCI DATA structure ========== SIZE_PciDataStruc = (OFFSET DevSignPtr)+(SIZE DevSignPtr)-(OFFSET PciSign) ENDS DATASEG ;messages AnyK DB YELLOW,23,29,"Press any key",0 ENDS SEGMENT sseg para stack 'STACK' ;//ругается линкер !!! DB 400h DUP(?) ENDS CODESEG ;//------------------------------------------------------------------// ;// MAIN PROCEDURE // ;//------------------------------------------------------------------// START: PROC P2A_ROM_Expansion mov AX,DGROUP mov DS,AX ;set display text mode and clear screen mov AX,3 int 10h ;clear screen call ClearScreen * * ; Основное тело программы * * @@EndRomExp: ;set Green color and show message ("Press any key") mov SI,offset AnyK call ShowColorString ; waiting press any key call GetChar ;set display mode mov ax,3 int 10h ;return to BIOS retf ;return to DOS // используется в exe-файле ; mov AH,4Ch ; int 21h ENDP P2A_ROM_Expansion ENDS END START
обсуждалось недавно http://wasm.ru/forum/viewtopic.php?id=20620http://wasm.ru/forum/viewtopic.php?id=20620 в твоем случае как org, так и размер результата меньше 64К, так что хватит чисто средств ТАСМа. только тебе это едва ли поможет, ты пытаешься как бинарник собрать конкретный .exe -- со стеком, датасегом и entrypoint'ом не с начала, со всеми выкающими выводами...
Переделай в скомканый файл, тоесть напиши вручную инициализацию стека и перенеси данные после кода. И есчё одно - фасм в деле создания бинарных файлов помоему рулит больше.
ukun А в какое ПЗУ ты пытаешься это прошить? - эта самая серьезная проблема. - а со стеком, и собственно с инструкциями mov AX,DGROUP mov DS,AX это не проблема - выдели участок памяти установи на него ss:sp и работай, если память еще не инициализированна, то посмотри как это сделано в BIOS на начальных этапах загрузи.
to _BC_: что я что-то делаю не так я и сам понял. Я прошу совета что делать правильно. Ну хотя бы что и где капать. А эту ссылку я и смотрел, однако она мне не помогла...
to PROFi: а почему прошивка ПЗУ - эта самая серьезная проблема? При наличии программатора мне это пока не видится затруднительным
Так не переходи, это всево лишь совет. Инициализируй данные и стек где нибуть в памяти и перепрошивай - все будет работать.