Ошибка выделения DOS при попытке запустить программу FASM - PullRequest
2 голосов
/ 30 июня 2019

У меня проблема с некоторым кодом.Это часть моей собственной ОС, которую я хочу построить в будущем и поделиться с SourceForge.У меня два файла сборки:

  1. gdos.asm, ядро.И ...
  2. vga.asm, мой собственный драйвер VGA.

В DOSBox все работает правильно.
Но когда я запускаю его в обычном MS-DOS на моем внешнемдиск, это вызывает эту ошибку:

Ошибка выделения памяти:
Не удалось загрузить COMMAND.COM.Система остановлена ​​

Эта проблема может быть связана с кодом, в котором я выделяю дополнительную память для программы путем изменения ее размера.Полный исходный код:

Первый файл: GDOS.ASM:

format MZ
stack 4096
entry GDOS_MAINSEG:GDOS_KERNEL_START

segment GDOS_MAINSEG
        GDOS_KERNEL_START: ; Punkt startowy jĄdra / Kernel start point
                        push cs
                        pop ds

                        push cs
                        pop es

                        mov ax,GDOS_KERNEL_END ;Autoalokacja do konkretnego rozmiaru / Autoallocation for concrete size
                        shr ax,4
                        inc ax
                        init: ;Inicjujemy GDOS
                        mov bx,ax
                        mov ah,0x4a
                        int 0x21

                        mov dx,DrvString0
                        call far GDOS_MAINSEG:gdosLoadDriverDOS

                        call far GDOS_MAINSEG:gdosSetModeByID


                        mov ax,0x4c00
                        int 0x21

                        GDOS_KERNEL_DATA:
                                DrvString0 : db 'VGA.BIN',0 ;Nazwa pliku dla sterownika VGA / Filename for VGA driver

                                GraphicsDriver: dw 0x0

                                g3:
                                dw 0,0
                                dw 0,0

                                DriverDeletionBuffer: TIMES 16 db 0
                                RecommendedDriverPosition: db 0

                        GDOS_KERNEL_FUNC:
                                gdosLoadDriverDOS: ;Funkcja adujĄca sterownik za pomocĄ DOS-a / Function loading driver with DOS
                                        push ds
                                        push es
                                        mov ax,0x3d00
                                        mov cl,0x0
                                        int 0x21
                                        jc end_gdosLoadDriverDOS
                                        mov si,ax ;Zapisz uchwyt / Save handle
                                        mov ah,0x48
                                        mov bx,1
                                        int 0x21
                                        jc end_gdosLoadDriverDOS
                                        mov es,ax
                                        mov ds,ax
                                        mov ah,0x3f
                                        mov cx,16
                                        mov bx,si
                                        mov dx,0
                                        int 0x21
                                        jc end_gdosLoadDriverDOS
                                        mov ah,0x42
                                        mov al,0x00
                                        mov cx,0
                                        mov dx,0
                                        int 0x21
                                        jc end_gdosLoadDriverDOS
                                        mov bx,[0x2]
                                        mov cx,bx
                                        shr bx,4
                                        inc bx
                                        mov ah,0x4a
                                        int 0x21
                                        mov bx,si
                                        mov dx,0
                                        mov ah,0x3f
                                        int 0x21
                                        mov [0x2],es
                                        mov bp,0x0
                                        call far [es:bp]
                                        push cs
                                        pop ds
                                        mov bp,g3
                                        mov [bp+2],es


                                        end_gdosLoadDriverDOS:
                                        pop es
                                        pop ds
                                        retf

                                gdosSetModeByID:
                                        push es
                                        push ds

                                        push cs
                                        pop ds

                                        mov bp,g3
                                        mov ax,[GraphicsDriver]
                                        shl ax,2
                                        add bp,ax

                                        mov di,[bp+2]
                                        mov es,di

                                        mov di,[es:11]

                                        sub sp,4
                                        mov bp,sp
                                        mov [ss:bp],di
                                        mov [ss:bp+2],es
                                        call far [ss:bp]

                                        add sp,4
                                        pop ds
                                        pop es
                                        retf

        GDOS_KERNEL_END:

Второй файл: VGA.ASM

    GDOS_DRIVER_START:
        GDOS_SECTION_DRIVER_HEADER:
                gEntry: dw vgaEntry ;Punkt wejścia sterownika / Driver entry
                gDriverSize: dw GDOS_DRIVER_END ;Rozmiar sterownika w bajtach  / Driver size in bytes
                gDriverType: db 1 ;0x1 - Sterownik grafiki / 0x1 - Graphics driver
                gPortsData: dw vgaPorts
                gMemData: dw vgaMem
                gShared: dw vgaShared ;Lista sterowników dla których zasoby są udostępnione
                gBasicFunc: dw vgaChangeModeID
                gBasicPtrs: dw vgaPtrs
        GDOS_SECTION_DRIVER_DATA:
                vgaIDString: db 'vga-drv$',0 ;SĹ‚uĹĽy do wyszukiwania sterownika przez GDOS / It's for GDOS driver search
                vgaShared0: db 'svga-drv',0
                vgaEntry:
                        retf
                vgaPorts:
                db 0x1
                db 2 
                dw 0x3c8,0x3c9
                db 0x0
                vgaMem:
                db 0x1
                db 2
                dd 0x0000A000,0x0000BFFF
                db 0x0
                vgaShared:
                db 0x1
                dw vgaShared0
                db 0x0

                vgaPtrs:
                        dw vgaModes
                vgaModes:


                vgaFunc:
                dw vgaChangeModeID

                vgaMisc_Common db 0x63
                R_W256 db 0x00
                R_W320 db 0x00
                R_W360 db 0x04
                R_W376 db 0x04
                R_W400 db 0x04

                R_H200 db 0x00
                R_H224 db 0x80
                R_H240 db 0x80
                R_H256 db 0x80
                R_H270 db 0x80
                R_H300 db 0x80
                R_H360 db 0x00
                R_H400 db 0x00
                R_H480 db 0x80
                R_H564 db 0x80
                R_H600 db 0x80

                HOR_REGS db 0x0,0x1,0x2,0x3,0x4,0x5,0x13
                VER_REGS db 0x6,0x7,0x9,0x10,0x11,0x12,0x15,0x16

                W256: db 0x5f,0x3f,0x40,0x82,0x4a,0x9a,0x20


                vgaChangeModeID: ;TEST
                push ds
                push cs
                pop ds
                mov ah,9
                mov dx,vgaIDString
                int 0x21
                pop ds
                retf

GDOS_DRIVER_END:

Для сборки файлов в GDOS.EXE и VGA.BIN Я использую команды:

fasm GDOS.ASM
fasm VGA.ASM

Когда программа запускается, я ожидаю, что она отобразит следующее, а затем вернется к приглашению DOS:

vga-drv

...