MS-DOS编码问题:
SEGBIOS SEGMENT AT BIOSSEG
ORG 0
DB 3 DUP(?)
;Reserve room for jump to
;init code
BIOSSTAT DB 3 DUP (?)
;Console input status check
BIOSIN DB 3 DUP (?)
;Get console character
BIOSOUT DB 3 DUP (?)
;Output console character
BIOSPRINT DB 3 DUP (?)
;Output to printer
BIOSAUXIN DB 3 DUP (?)
;Get byte from auxilliary
BIOSAUXOUT DB 3 DUP (?)
;Output byte to auxilliary
BIOSREAD DB 3 DUP (?)
;Disk read
BIOSWRITE DB 3 DUP (?)
;Disk write
BIOSDSKCHG DB 3 DUP (?)
;Dsik-change status
BIOSSETDATE DB 3 DUP (?)
;Set date
BIOSSETTIME DB 3 DUP (?)
;Set time
BIOSGETTIME DB 3 DUP (?)
;Get time and date
BIOSFLUSH DB 3 DUP (?)
;Clear console input buffer
BIOSMAPDEV DB 3 DUP (?)
;Dynamic disk table mapper
SEGBIOS ENDS
------ some code here ----
AUXIN:
CALL FAR PTR BIOSAUXIN
RET
我很难理解为什么和如何调用BIOSAUXIN变量,因为我们不能调用变量,因为据我所知只有函数、方法或过程可以调用
1条答案
按热度按时间qhhrdooz1#
即使这些看起来像变量,它们实际上是什么,是存储
JMP
的位置,因此为每个位置保留三个字节(一个用于jmp
,两个用于操作数。)每一个都将您带到代码的某个部分,该部分以远返回结束,将您带回到CALL FAR PTR BIOSAUXIN
之后的行,在本例中为ret
。跳桌”或“蹦床”。你可能会想,“为什么不直接用
CALL
作为目标呢?”这是为了兼容性。有许多不同版本的MS-DOS,在不同的硬件上运行,有不同的要求。如果你买了一台新电脑,有一个修订版的MS-DOS,你不会希望所有你花钱买的软件都停止工作,有一个跳转表为程序员和最终用户解决了这个问题,因为存储在这些数据块中的地址在新计算机上是否与以前不同已不再重要。只要跳转表在内存中的位置在所有计算机和所有版本的MS-DOS上都是相同的,你仍然会通过CALL
来完成“正确的”函数,而不是使用JMP
来跳过它。