assembly 汇编语言MS-DOS调用结构中的变量

jobtbby3  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(133)

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变量,因为我们不能调用变量,因为据我所知只有函数、方法或过程可以调用

qhhrdooz

qhhrdooz1#

即使这些看起来像变量,它们实际上是什么,是存储JMP的位置,因此为每个位置保留三个字节(一个用于jmp,两个用于操作数。)每一个都将您带到代码的某个部分,该部分以远返回结束,将您带回到CALL FAR PTR BIOSAUXIN之后的行,在本例中为ret。跳桌”或“蹦床”。
你可能会想,“为什么不直接用CALL作为目标呢?”这是为了兼容性。有许多不同版本的MS-DOS,在不同的硬件上运行,有不同的要求。如果你买了一台新电脑,有一个修订版的MS-DOS,你不会希望所有你花钱买的软件都停止工作,有一个跳转表为程序员和最终用户解决了这个问题,因为存储在这些数据块中的地址在新计算机上是否与以前不同已不再重要。只要跳转表在内存中的位置在所有计算机和所有版本的MS-DOS上都是相同的,你仍然会通过CALL来完成“正确的”函数,而不是使用JMP来跳过它。

相关问题