小弟实在没有分了,有一个小程序,请高手帮忙改一下哦
小弟实在没有分了,有一个小程序,编译时出现out of memory,请高手帮忙改一下哦,顺便帮我写一注释哦,我看不太懂~~~~
cursor equ 45H
attrib equ 2fh
code segment
assume cs:code,ds:code
start:
jmp go
oldcur dw ?
OLD1C DW 2 DUP(?)
NEWINT1C:
PUSHF
CALL DWORD PTR CS:OLD1C
push ax
PUSH BX
PUSH CX
PUSH DX
XOR BH,BH
MOV AH,3
INT 10H
MOV CS:OLDCUR,DX
MOV AH,2
xor bh,bh
MOV DX,CURSOR
INT 10H
MOV AH,2 ;读取系统时钟
INT 1AH
PUSH DX
PUSH CX
POP BX
PUSH BX
CALL SHOWBYTE
CALL SHOWCOLON
POP BX
XCHG BH,BL
CALL SHOWBYTE
CALL SHOWCOLON
POP BX
CALL SHOWBYTE
MOV DX,CS:OLDCUR
MOV AH,2
XOR BH,BH
INT 10H
POP DX
POP CX
POP BX
POP AX
IRET
SHOWBYTE PROC NEAR
PUSH BX
MOV CL,4
MOV AL,BH
SHR AL,CL
ADD AL,30H
CALL SHOW
CALL CURMOVE
POP BX
MOV AL,BH
AND AL,0FH
ADD AL,30H
CALL SHOW
CALL CURMOVE
RET
SHOWBYTE ENDP
SHOWCOLON PROC NEAR
MOV AL,':'
CALL SHOW
CALL CURMOVE
RET
SHOWCOLON ENDP
CURMOVE PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,3
MOV BH,0
INT 10H
INC DL
MOV AH,2
INT 10H
POP DX
POP CX
POP BX
POP AX
RET
CURMOVE ENDP
SHOW PROC NEAR
PUSH AX
PUSH BX
PUSH CX
MOV AH,09H
MOV BX,attrib
MOV CX,1
INT 10H
POP CX
POP BX
POP AX
RET
SHOW ENDP
GO:
PUSH CS
POP DS
MOV AX,351CH ;取中断向量
INT 21H
MOV OLD1C,BX ;保存原中断向量
MOV BX,ES
MOV OLD1C+2,BX
MOV DX,OFFSET NEWINT1C ;置新的中断向量
MOV AX,251CH
INT 21H
MOV DX,OFFSET GO
SUB DX,OFFSET START
MOV CL,4
SHR DX,CL
ADD DX,11H
MOV AX,3100H ;结束并驻留
INT 21H
CODE ENDS
END START
问题点数:20、回复次数:13Top
1 楼DingYugao(小高)回复于 2006-06-02 03:45:54 得分 0
终于编译通过了,但是我在win2003里运行出现提示NTVDM 遇到一个硬错误,这个要怎么解决呢,是怎么会事呢.汗~~~~~~Top
2 楼zara(Kyrie eleison)回复于 2006-06-02 06:40:01 得分 0
在 assume 语句后加上 org 100h 语句, 将程序做成 .com 格式的文件再试试Top
3 楼DingYugao(小高)回复于 2006-06-02 13:38:32 得分 0
按照上面的说法做成了.com文件了
可以运行了
但是请问com和exe文件有什么区别呢,为什么exe的就不能运行呢Top
4 楼zara(Kyrie eleison)回复于 2006-06-02 13:44:56 得分 0
在载入内存后, com 是从 PSP 开始编址的, 所以有开始 org 100h 语句, (前面的 100h 字节就是 PSP 部分). 但 exe 文件就不是, 如果代码段前还有其它数据段的话, 情况会更糟更复杂. 因此, 一般地, 只要有可能就会把驻留型的程序写成 com 格式, 其驻留地址的计算比较简单, 只要直接运算需要驻留到的标号就可以了. 如果是 exe 的话, 就要复杂得多, 除了代码段内的这个驻留部分外, 还需要再加上 PSP 的 100h 字节, 如果前面有需要的数据段的话, 也需要再加上.Top
5 楼DingYugao(小高)回复于 2006-06-03 18:36:17 得分 0
MOV CL,4
SHR DX,CL
ADD DX,11H
请问为什么这里的11H呢Top
6 楼zara(Kyrie eleison)回复于 2006-06-03 19:11:03 得分 0
11h, 其中的 10h (节, Para.s) 即 100h 字节为为了包括 PSP 的, 另外的 1 节即 10h 自己是为代码段的最后不足 1 节而被 shr 指令去掉的那个节补足的. 这样计算的话, 不是必须创建为 com 格式的文件才可以的. 刚才试了你原来的代码, 作为 exe 格式时, 在 xp/sp2 下也是正常的, 不知道你开始说的在 2003 中的错误是什么Top
7 楼DingYugao(小高)回复于 2006-06-03 21:28:45 得分 0
在2003里运行exe文件是这样的:
NTVDM遇到一个硬错误!
"不是必须创建为 com 格式的文件才可以的"这就话不太清楚哦
Top
8 楼DingYugao(小高)回复于 2006-06-04 04:19:33 得分 0
call dword ptr cs:old1c
请问为什么要一句呢,?:Top
9 楼zara(Kyrie eleison)回复于 2006-06-04 07:14:22 得分 0
不是必须创建为 com 格式的文件才可以的, 就是按照定楼的代码生成的 .exe 格式的程序, 也是可以正常运行的. 我在 xp/sp2 下试过的. 不明白为什么 2003 下的错误信息.
call dword ptr cs:old1c, 这个是调用原来的中断 1ch 以实现原中断的功能. 自己接管某个中断时, 一般度需要这么做, 不然的话原中断功能不能完成可能会导致意外Top
10 楼DingYugao(小高)回复于 2006-06-04 12:43:00 得分 0
那为什么要 dword ptr呢Top
11 楼zara(Kyrie eleison)回复于 2006-06-04 13:43:51 得分 0
双字, CS:IP, 远指针调用Top
12 楼DingYugao(小高)回复于 2006-06-04 16:40:05 得分 0
不好意思哦
再问一下,为什么要用双字呢Top
13 楼zara(Kyrie eleison)回复于 2006-06-04 17:54:46 得分 0
双字就是完整的 段+偏址 的寻址模式, 这个是由需要表示的地址范围和寻址方式决定的.Top




