проблемы языка ассемблера при работе с кодировкой файлов msdos - PullRequest
0 голосов
/ 25 апреля 2018

, как указано в файле readme.txt : вы должны связать свой BIOS , чтобы выполнить обратный вызов в BIOS в конце SYSINIT . если вам не нужен этот вызов, просто найдите дальний RET, пометьте его как RE_INIT и объявите его открытым. моя проблема начинается здесь:

Я очень озадачен тем, что мне нужно найти far RET в SKELIO.ASM файле и пометить его как RE_INIT (но где я должен разместить этот ярлык?) Или я должен пойти для Файл "SYSINIT.ASM" и найдите far RET там и пометьте его как RE_INIT (как?). Пожалуйста, смотрите код ниже для некоторой части обоих файлов. Я должен отметить, что файл skelio.asm предназначен для bios, а файл sysinit.asm для инициализации системы.

SKELIO.ASM : следующий код

; I/O system for Version 2.x of MSDOS.

;This BIOS designed to be linked with the SYSINIT module provided by
;Microsoft

BIOSIZ  EQU     4096            ;Size of BIOS in bytes.
BIOSIZS EQU     100H            ;Size of BIOS in Paragraphs.
ANSI    EQU     0               ;Ansi switch.

;Additional Information for the ALTOS machine.

QSIZE   EQU     100             ;Input queue size.
BIOSSEG EQU     0C0H            ;I/O system segment.
MAX_MEM EQU     4000H           ;Memory size in paragraphs.

; Constants for commands in Altos ROM.

ROM_CONSTA      EQU     01      ;Return status AL of console selected in CX.
ROM_CONIN       EQU     02      ;Get char. from console in CX to AL
ROM_CONOUT      EQU     03      ;Write char. in DL to console in CX.
ROM_PMSG        EQU     07      ;Write string ES:DX to console in CX.
ROM_DISKIO      EQU     08      ;Perform disk I/O from IOPB in ES:CX.
ROM_INIT        EQU     10      ;Returns boot console and top memory ES:DX.

;Things needed to communicate with SYSINIT

EXTRN   SYSINIT:FAR                   ;The entry point of SYSINIT
EXTRN   CURRENT_DOS_LOCATION:WORD     ;Where the DOS is when SYSINIT called
EXTRN   FINAL_DOS_LOCATION:WORD       ;Where I want SYSINIT to put the DOS
EXTRN   DEVICE_LIST:DWORD             ;Pointer to the DEVICE list.
EXTRN   MEMORY_SIZE:WORD              ;Size in paragraphs of Physical 
;memory.
EXTRN   DEFAULT_DRIVE:BYTE            ;Default Drive to use when system 
;booted
EXTRN   BUFFERS:BYTE                  ;Number of default buffers.
                                  ; Leave as is and SYSINIT uses only 2.

CODE    SEGMENT
ASSUME  CS:CODE,DS:CODE,ES:CODE,SS:CODE

    ORG     0               ;Starts at an offset of zero.

INIT:   JMP     HWINIT

    PAGE

    SUBTTL  Device driver tables.
------- and so on
--------SKELIO.ASM code ends here
------------------------------------------------------------------------
SYSINIT.ASM: code as follows

TITLE   BIOS SYSTEM INITIALIZATION

FALSE   EQU     0
TRUE    EQU     NOT FALSE
IBMVER     EQU     FALSE
IBM        EQU     IBMVER
IBMJAPVER  EQU     FALSE                ; If TRUE set KANJI true also
MSVER      EQU     TRUE 
ALTVECT    EQU     FALSE                ; Switch to build ALTVECT version
HIGHMEM    EQU     FALSE
KANJI      EQU     FALSE

    IF      IBMVER OR IBMJAPVER
NOEXEC  EQU     TRUE
    ELSE
NOEXEC  EQU     FALSE
    ENDIF

; Set to agree with those in DOST:MSHEAD.ASM, ALTVECT version only
MAJOR_VERSION   EQU      2
MINOR_VERSION   EQU     0B  ;2.11

DOSSIZE EQU     5000H

; Internal DOS data returned by DOSINIT

SYSINITVAR  STRUC
DPBHEAD     DD      ?                   ; Pointer to head of DPB-FAT list
sft_addr    DD      ?                   ; Pointer to first FCB table
; The following address points to the CLOCK device
BCLOCK      DD      ?
; The following address is used by DISKSTATCHK it is always
; points to the console input device header
BCON        DD      ?                   ; Console device entry points
NUMIO       DB      0                   ; Number of disk tables
MAXSEC      DW      0                   ; Maximum allowed sector size
BUFFHEAD    DD      ?                   ; Head of buffer queue
DEVHEAD     DD      ?
SYSINITVAR  ENDS

    INCLUDE DOSSYM.ASM
    INCLUDE DEVSYM.ASM

    IF      NOT IBM
    IF      NOT IBMJAPVER

    ENDIF
    ENDIF

SYSINITSEG      SEGMENT PUBLIC 'SYSTEM_INIT'
------------------------------ and so on
------------------------------ and so on
LOCSTACK LABEL BYTE

    CALL    MSDOS
    MOV     WORD PTR [DOSINFO+2],ES ; SAVE POINTER TO DOS INFO
    MOV     WORD PTR [DOSINFO],DI

    IF      NOT IBM
    IF      NOT IBMJAPVER
    CALL    RE_INIT                 ; Re-call the BIOS <-----**problem**
    ENDIF
    ENDIF

    STI
    CLD

    IF      HIGHMEM
    PUSH    DS
    MOV     BX,DS
    ADD     BX,10H
    MOV     ES,BX
    PUSH    CS
    POP     DS
    XOR     SI,SI
    MOV     DI,SI
    MOV     CX,OFFSET SYSSIZE + 1
    SHR     CX,1                    ; Divide by 2 to get words

sysinit.asm код заканчивается здесь

я пытаюсь связать skelio.obj, sysinit.obj и sysimes.obj вместе так что я получу MS DOS EXE-файл, и я смогу запустить MS DOS используй это. спасибо. пожалуйста, укажите, что я должен искать файл skelio.asm для FAR RET и пометьте его как RE_INIT или я должен сделать то же самое с файлом sysinit.asm.

...