window XP下不能运行masm5.0编写的dos程序吗??

时间:2022-02-05 01:13:41
情况是这样的!我用masm5.0编写了一个最最简单的dos程序--在屏幕上打印一串信息,是调用int21的09h功能做的,但是编译连接好之后,在windowsXP下一运行,就弹出个对话框显示[无效指令],我一直忽略,一直都有这个对话框弹出来!
后来我下载了一个32位的debug程序,用-A命令来调试int21的09h,结果一运行这个语句,debug程序就死在那边了!
所以请教各位大侠,这种情况到底是怎么一回事呢?是不是windowsXP不支持的原因,如果有哪为大哥成功的实现了我上面所说的,请把您详细的步骤告诉我可以吗!
在此,先谢谢各位了!

13 个解决方案

#1


不可能不支持

#2


好象windows xp程序设计已经不支持中断了。

#3


八成是忘写程序结束指令(mov ah,4ch    int 21h)

#4


恩。。。。。。。。反正在2000下和98下是不太一样的,有些直接写端口的程序在2000下不能运行,其他的操作我还没有发现什么不同啊!

#5


用BOCHS吧,那个东西应该可以的吧!

#6


一定能用,我用过呀

#7


好像要用exe2bin.exe转为com格式

#8


大家好,谢谢各位的回复,上面有兄弟说成功过的,所以我今天就做了实验:
我的机器装的是windowsXP 编译器使用了masm5.0 
汇编代码如下:
data segment
message db "Hello",'$'
data ends

code segment
assume cs:code,ds:data
begin:
     mov ax,data
     mov ds,ax
     mov dx,offset message
     mov ah,09h
     int 21
     mov ah,4ch
     int 21
code ends
end begin
编译连接成功生成可执行文件,运行可执行文件,程序死在那边,也没有显示Hello信息!
这个时候我还是以为windowsXP不支持int 21的09h功能,正打算收手!突然想到用debug调试一下!也好死心,于是我运行debug disp.exe
在调用-u 0查看装入内存的程序的汇编代码,这个时候问题出现了,结果为(屏幕信息):
C:\Documents and Settings\wutao\My Documents\????\????\???????>debug disp.exe
-r
AX=0000  BX=0000  CX=0020  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B39  ES=0B39  SS=0B49  CS=0B4A  IP=0000   NV UP EI PL NZ NA PO NC
0B4A:0000 B8490B        MOV     AX,0B49
-u 0
0B4A:0000 B8490B        MOV     AX,0B49
0B4A:0003 8ED8          MOV     DS,AX
0B4A:0005 BA0000        MOV     DX,0000
0B4A:0008 B409          MOV     AH,09
0B4A:000A CD15          INT     15
0B4A:000C B44C          MOV     AH,4C
0B4A:000E CD15          INT     15
0B4A:0010 1E            PUSH    DS
0B4A:0011 54            PUSH    SP
0B4A:0012 DB8C1624DD8C  ESC     19,[SI+2416]TBYTE PTR [SI+8CDD]
0B4A:0018 06            PUSH    ES
0B4A:0019 28DD          SUB     CH,BL
0B4A:001B 8F0614DD      POP     [DD14]
0B4A:001F 8F0618DD      POP     [DD18]
-
哈哈,真奇怪,代码中的int 21全部变成了int 15,我也不知道int 15功能是什么反正导致程序异常!
于是,为了实验int 21的09h功能winXP是否支持,我又有了如下动作,最后成功了:
-a a
0B4A:000A int 21
0B4A:000C
-a e
0B4A:000E int 21
0B4A:0010
-u 0
0B4A:0000 B8490B        MOV     AX,0B49
0B4A:0003 8ED8          MOV     DS,AX
0B4A:0005 BA0000        MOV     DX,0000
0B4A:0008 B409          MOV     AH,09
0B4A:000A CD21          INT     21
0B4A:000C B44C          MOV     AH,4C
0B4A:000E CD21          INT     21
0B4A:0010 1E            PUSH    DS
0B4A:0011 54            PUSH    SP
0B4A:0012 DB8C1624DD8C  ESC     19,[SI+2416]TBYTE PTR [SI+8CDD]
0B4A:0018 06            PUSH    ES
0B4A:0019 28DD          SUB     CH,BL
0B4A:001B 8F0614DD      POP     [DD14]
0B4A:001F 8F0618DD      POP     [DD18]
-g
Hello
Program terminated normally
-
哈哈,实践证明winXP是支持地!!
不过我还要请教各位大侠:为什么按照我源程序编译后的可执行文件载入后会变成int 15呢,我真是百思不得其解,还请高手指点!难道masm5.0在XP下运行会有bug?????
呵呵,谢谢大家拉!

#9


原来我一直在XP下运行这个disp.exe文件都说是无效指令或者程序异常,我都以为是XP不支持,实际上不是了,是因为disp.exe中的指令实际上变成了int 15,所以运行disp.exe会导致异常!

#10


INT 21H

#11


对哦,是的,呵呵!我在debug里面用习惯了,把数值都认为是16位的了!那么现在所有的问题都解决了,谢谢各位,谢谢李诚大哥!结帖

#12


回复人: csdsjkk() ( ) 信誉:99  2004-1-8 10:15:38  

八成是忘写程序结束指令(mov ah,4ch    int 21h)


你该谢他

#13


感谢大家

#1


不可能不支持

#2


好象windows xp程序设计已经不支持中断了。

#3


八成是忘写程序结束指令(mov ah,4ch    int 21h)

#4


恩。。。。。。。。反正在2000下和98下是不太一样的,有些直接写端口的程序在2000下不能运行,其他的操作我还没有发现什么不同啊!

#5


用BOCHS吧,那个东西应该可以的吧!

#6


一定能用,我用过呀

#7


好像要用exe2bin.exe转为com格式

#8


大家好,谢谢各位的回复,上面有兄弟说成功过的,所以我今天就做了实验:
我的机器装的是windowsXP 编译器使用了masm5.0 
汇编代码如下:
data segment
message db "Hello",'$'
data ends

code segment
assume cs:code,ds:data
begin:
     mov ax,data
     mov ds,ax
     mov dx,offset message
     mov ah,09h
     int 21
     mov ah,4ch
     int 21
code ends
end begin
编译连接成功生成可执行文件,运行可执行文件,程序死在那边,也没有显示Hello信息!
这个时候我还是以为windowsXP不支持int 21的09h功能,正打算收手!突然想到用debug调试一下!也好死心,于是我运行debug disp.exe
在调用-u 0查看装入内存的程序的汇编代码,这个时候问题出现了,结果为(屏幕信息):
C:\Documents and Settings\wutao\My Documents\????\????\???????>debug disp.exe
-r
AX=0000  BX=0000  CX=0020  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B39  ES=0B39  SS=0B49  CS=0B4A  IP=0000   NV UP EI PL NZ NA PO NC
0B4A:0000 B8490B        MOV     AX,0B49
-u 0
0B4A:0000 B8490B        MOV     AX,0B49
0B4A:0003 8ED8          MOV     DS,AX
0B4A:0005 BA0000        MOV     DX,0000
0B4A:0008 B409          MOV     AH,09
0B4A:000A CD15          INT     15
0B4A:000C B44C          MOV     AH,4C
0B4A:000E CD15          INT     15
0B4A:0010 1E            PUSH    DS
0B4A:0011 54            PUSH    SP
0B4A:0012 DB8C1624DD8C  ESC     19,[SI+2416]TBYTE PTR [SI+8CDD]
0B4A:0018 06            PUSH    ES
0B4A:0019 28DD          SUB     CH,BL
0B4A:001B 8F0614DD      POP     [DD14]
0B4A:001F 8F0618DD      POP     [DD18]
-
哈哈,真奇怪,代码中的int 21全部变成了int 15,我也不知道int 15功能是什么反正导致程序异常!
于是,为了实验int 21的09h功能winXP是否支持,我又有了如下动作,最后成功了:
-a a
0B4A:000A int 21
0B4A:000C
-a e
0B4A:000E int 21
0B4A:0010
-u 0
0B4A:0000 B8490B        MOV     AX,0B49
0B4A:0003 8ED8          MOV     DS,AX
0B4A:0005 BA0000        MOV     DX,0000
0B4A:0008 B409          MOV     AH,09
0B4A:000A CD21          INT     21
0B4A:000C B44C          MOV     AH,4C
0B4A:000E CD21          INT     21
0B4A:0010 1E            PUSH    DS
0B4A:0011 54            PUSH    SP
0B4A:0012 DB8C1624DD8C  ESC     19,[SI+2416]TBYTE PTR [SI+8CDD]
0B4A:0018 06            PUSH    ES
0B4A:0019 28DD          SUB     CH,BL
0B4A:001B 8F0614DD      POP     [DD14]
0B4A:001F 8F0618DD      POP     [DD18]
-g
Hello
Program terminated normally
-
哈哈,实践证明winXP是支持地!!
不过我还要请教各位大侠:为什么按照我源程序编译后的可执行文件载入后会变成int 15呢,我真是百思不得其解,还请高手指点!难道masm5.0在XP下运行会有bug?????
呵呵,谢谢大家拉!

#9


原来我一直在XP下运行这个disp.exe文件都说是无效指令或者程序异常,我都以为是XP不支持,实际上不是了,是因为disp.exe中的指令实际上变成了int 15,所以运行disp.exe会导致异常!

#10


INT 21H

#11


对哦,是的,呵呵!我在debug里面用习惯了,把数值都认为是16位的了!那么现在所有的问题都解决了,谢谢各位,谢谢李诚大哥!结帖

#12


回复人: csdsjkk() ( ) 信誉:99  2004-1-8 10:15:38  

八成是忘写程序结束指令(mov ah,4ch    int 21h)


你该谢他

#13


感谢大家