Assembly 30小时中断给出错误的DOS版本
我正在64位AMD处理器上运行Windows 8的32位副本。我正在学习8086汇编课程,这本书给出了一个如何获取DOS版本号的示例。当我启动cmd.exe时,它在顶部告诉我它是版本6.2.9200。另外,当我运行“VER”DOS命令时,它告诉我同样的事情。然而,当我执行一个30小时的中断程序来获取DOS版本号时,它告诉我我正在运行DOS版本5.0。什么能解释这种差异 顺便说一下,我使用命令Assembly 30小时中断给出错误的DOS版本,assembly,masm,x86-16,Assembly,Masm,X86 16,我正在64位AMD处理器上运行Windows 8的32位副本。我正在学习8086汇编课程,这本书给出了一个如何获取DOS版本号的示例。当我启动cmd.exe时,它在顶部告诉我它是版本6.2.9200。另外,当我运行“VER”DOS命令时,它告诉我同样的事情。然而,当我执行一个30小时的中断程序来获取DOS版本号时,它告诉我我正在运行DOS版本5.0。什么能解释这种差异 顺便说一下,我使用命令ML/Fl DOSVER.ASM在MASM6中组装了下面的代码 .MODEL SMALL .D
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
您在命令行界面顶部看到的版本号(由
VER
命令返回)是Windows版本,而不是DOS
版本。据我所知,Windows命令行界面是一个DOS仿真器,而不是MS-DOS的实际实例。似乎基于Windows NT的系统(包括Windows 8)模拟了MS-DOS的5.0版本(这似乎是建议的,而且也是),这似乎与您所描述的一致。;添加ASCII偏差
-嗯,你是电气工程师吗?我正在攻读电子工程学士学位。嘿嘿,我对自己很满意。:)你的代码或注释没有问题——但我猜一个有数学或计算机科学背景的人会写“偏移量”。)我看到问题了。。。Windows 8于2012年8月1日发布,版本为6.2.9200(是的,它是Windows版本)。是否有显示DOS版本的命令?从我所看到的,您可能一直在使用汇编程序提供的内容。。严格地说,您是在DOS仿真器中工作,而不是在实际的DOS环境中工作,因此“正确”版本是从VER
命令返回的,而int 21h,AX=30h返回的是windows正在模拟的DOS版本。从我在一些以前版本的Windows中看到,有很多方法可以获得“模拟”版本,但对于较新的版本,似乎没有什么东西跳出来-尽管如果有命令可以做到这一点,我很高兴得到纠正!