30H中断给出了错误的DOS版本

时间:2013-03-16 01:42:47

标签: assembly masm x86-16

我在64位AMD处理器上运行Windows 8的32位副本。我正在参加一个8086的装配课程,本书给出了一个如何获得DOS版本号的例子。当我启动cmd.exe时,它告诉我顶部是版本6.2.9200。此外,当我运行“VER”DOS命令时,它告诉我同样的事情。但是,当我执行30H中断例程以获取DOS版本号时,它告诉我我正在运行DOS版本5.0。什么可以解释这种差异?

顺便说一下,我使用ML /Fl DOSVER.ASM命令在MASM6中汇编了下面的代码。

   .MODEL SMALL
   .DATA
   VNS    DB  'DOS Version $'

   .CODE
   .STARTUP
   LEA   DX,VNS     ;set up pointer to output string
   MOV   AH,9       ;display string
   INT   21H        ;DOS call
   MOV   AH,30H     ;get DOS version number
   INT   21H        ;DOS call
   PUSH  AX         ;save copy of version number
   ADD   AL,30H     ;add ASCII bias to major version number
   MOV   DL,AL      ;prepare for output
   MOV   AH,2       ;output character to screen
   INT   21H        ;DOS call
   MOV   DL,'.'     ;load a period
   MOV   AH,2       ;output character to screen
   INT   21H        ;DOS call
   POP   AX         ;get version number back
   MOV   AL,AH      ;load minor version number
   MOV   BL,10      ;divide minor version number by 10
   SUB   AH,AH
   DIV   BL
   ADD   AL,30H     ;add ASCII bias
   MOV   DL,AL      ;prepare for output
   MOV   AH,2       ;output character to screen
   INT   21H        ;DOS call
   .EXIT

   END

1 个答案:

答案 0 :(得分:1)

您在命令行界面顶部看到的版本号以及VER命令返回的版本号是Windows版本,而不是DOS版本。据我所知,Windows命令行界面是DOS模拟器,而不是MS-DOS的实际实例。似乎基于Windows NT的系统,包括Windows 8,模拟5.0版本的MS-DOS(这似乎是建议herehere) - 这似乎与什么一致你形容。