【发布时间】:2019-05-25 06:45:21
【问题描述】:
请帮助我理解问题 1 和 2。
标记为“问题 1”的代码行是如何工作的?
当我们在“问题 2”中调用 ROM_CALL 会发生什么?
ROMRTN DD 0FE000000H ;Main ROM entry point.
ROM_CALL:
PUSH DI
PUSH SI
PUSH BP
PUSH DX
PUSH ES
CALL CS:DWORD PTR [ROMRTN] ;PROBLEM 1
POP ES
POP DX
POP BP
POP SI
POP DI
RET
PAGE
SUBTTL Initalization code and temporary work areas.
;
; Overlayed by MSDOS by SYSINIT.
;
WRKSTK LABEL WORD
DB 100 DUP (?)
HWINIT: XOR BP,BP
MOV SS,BP
MOV SP,OFFSET WRKSTK+98 ;Some nice area for
;stack
PUSH CS
POP ES
MOV BX,ROM_INIT
CALL ROM_CALL ;PROBLEM 2
MOV AH,0
MOV MCON,AX
MOV AX,SEG SYSINIT
MOV DS,AX
ASSUME DS:SEG SYSINIT
MOV AX,CS
ADD AX,BIOSIZS
MOV DS:[CURRENT_DOS_LOCATION],AX
MOV DS:[MEMORY_SIZE],MAX_MEM
MOV AX,CS
MOV WORD PTR DS:[DEVICE_LIST+2],AX
MOV WORD PTR DS:[DEVICE_LIST],OFFSET
DEVSTART
MOV AX,CS
ADD AX,((OFFSET WRKSTK - OFFSET INIT)+50) /16
MOV DS:[FINAL_DOS_LOCATION],AX
JMP SYSINIT
DOSSPOT LABEL WORD
CODE ENDS
END
我认为下面给出的 URL 将帮助您理解逻辑。代码快照取自完整程序的最后一个。
https://github.com/Microsoft/MS-DOS/blob/master/v2.0/source/SKELIO.ASM
【问题讨论】:
-
看起来非常简单:对函数 (
ROM_CALL) 的近调用通过内存间接 seg:off 进行远调用。有没有你在文中没有提到的更复杂的事情发生? -
0FE000000H将它放在系统 BIOS 中间的某个位置。我不知道该特定入口点是否已公开记录,但鉴于您正在查看 IO.SYS,可能与初始化每个系统设备驱动程序有关。