关于内存驻留程序的问题

suchx 2009-12-09 10:08:54
我看杨季文的80X86汇编语言教材,做一个打印屏幕的内存驻留程序,但总提示遇到无效的指令,不知道怎么回事,希望大家指教
这个是有问题的程序
ASSUME CS:CSEG,DS:CSEG
CR=0DH
LF=0AH
HEAD=1AH
TAIL=1CH
BUFHEAD=1EH
BUFTAIL=3EH
KEY=6500H;CTRL+F8
CSEG SEGMENT
OLD09H DW 2 DUP(0)
FADR DW 0
BUF DB 0
FNAME DB 'D:\MASM\SCREEN.TXT',0
CREATERR DB 'CANNOT CREAT FILE .',CR,LF,'$'
WRITERR DB 'CANNOT WRITE FILE .',CR,LF,'$'
NEW09H: PUSHF
CALL DWORD PTR CS:OLD09H
STI
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX,40H
MOV DS,AX
MOV BX,DS:[HEAD]
CMP BX,DS:[TAIL]
JZ L1
MOV AX,DS:[BX]
CMP AX,KEY
JZ L2
L1:POP DX
POP CX
POP BX
POP AX
POP DS
IRET
L2:ADD BX,2
CMP BX,BUFTAIL
JNZ L3
MOV BX,BUFHEAD
L3:MOV DS:[HEAD],BX
MOV AX,CS
MOV DS,AX
LEA DX,FNAME
MOV AH,3CH
MOV CX,0
INT 21H
JNC L4
LEA DX,CREATERR
MOV AH,9
INT 21H
JMP L1
L4:MOV FADR,AX
MOV BH,0
MOV DX,0
MOV AH,2
INT 10H
L6:MOV BH,0
MOV AH,8
INT 10H
MOV BUF,AL
MOV BX,FADR
MOV CX,1
LEA DX,BUF
MOV AH,40H
INT 21H
JNC L5
L9:LEA DX,WRITERR
MOV AH,9
INT 21H
JMP L7
L5:MOV BH,0
MOV AH,3
INT 10H
CMP DL,79
JZ L8
INC DL
MOV BH,0
MOV AH,2
INT 10H
JMP L6
L8:INC DH
CMP DH,25
JZ L7
MOV DL,0
MOV BH,0
MOV AH,2
INT 10H
MOV BX,FADR
MOV BUF,CR
MOV CX,1
LEA DX,BUF
MOV AH,40H
INT 21H
JC L9
MOV BX,FADR
MOV BUF,LF
MOV CX,1
LEA DX,BUF
MOV AH,40H
INT 21H
JC L9
JMP L6
L7:MOV BX,FADR
MOV AH,3EH
INT 21H
JMP L1
START : NOP
MOV AX,CS
MOV DS,AX
MOV AX,3509H
INT 21H
MOV OLD09H,BX
MOV OLD09H+2,ES
LEA DX,NEW09H
MOV AX,2509H
INT 21H
MOV DX,OFFSET NEW09H+15
MOV CX,4
SHR DX,CL
ADD DX,10H
MOV AX,3100H
INT 21H
CSEG ENDS
END START


我为了DEBUG方便,把它改写成不是内存驻留的程序,它就工作正常了
用方法是BIOS中断直接读一个字符,然后再移动光标的位置,去读下一个字符
ASSUME CS:CSEG,DS:CSEG
CR=0DH
LF=0AH
HEAD=1AH
TAIL=1CH
BUFHEAD=1EH
BUFTAIL=3EH
KEY=6500H;CTRL+F8
CSEG SEGMENT
OLD09H DW 2 DUP(0)
FADR DW 0
BUF DB 0
FNAME DB 'D:\MASM\SCREEN.TXT',0
CREATERR DB 'CANNOT CREAT FILE .',CR,LF,'$'
WRITERR DB 'CANNOT WRITE FILE .',CR,LF,'$'
NEW09H PROC
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
JMP L2
L1:POP DX
POP CX
POP BX
POP AX
POP DS
RET
L2:LEA DX,FNAME
MOV AH,3CH
MOV CX,0
INT 21H
JNC L4
LEA DX,CREATERR
MOV AH,9
INT 21H
JMP L1
L4:MOV FADR,AX
MOV BH,0
MOV DX,0
MOV AH,2
INT 10H
L6:MOV BH,0
MOV AH,8
INT 10H
MOV BUF,AL
MOV BX,FADR
MOV CX,1
LEA DX,BUF
MOV AH,40H
INT 21H
JNC L5
L9:LEA DX,WRITERR
MOV AH,9
INT 21H
JMP L7
L5:MOV BH,0
MOV AH,3
INT 10H
CMP DL,79
JZ L8
INC DL
MOV BH,0
MOV AH,2
INT 10H
JMP L6
L8:INC DH
CMP DH,25
JZ L7
MOV DL,0
MOV BH,0
MOV AH,2
INT 10H
MOV BX,FADR
MOV BUF,CR
MOV CX,1
LEA DX,BUF
MOV AH,40H
INT 21H
JC L9
MOV BX,FADR
MOV BUF,LF
MOV CX,1
LEA DX,BUF
MOV AH,40H
INT 21H
JC L9
JMP L6
L7:MOV BX,FADR
MOV AH,3EH
INT 21H
JMP L1
START : NOP
MOV AX,CS
MOV DS,AX
CALL NEW09H
MOV AX,4C00H
INT 21H
CSEG ENDS
END START
...全文
81 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2009-12-10
  • 打赏
  • 举报
回复
MOV DX,OFFSET NEW09H+15
驻留的代码长度不足,改为
MOV DX,OFFSET START+15
suchx 2009-12-10
  • 打赏
  • 举报
回复
看来汇编真是容易出错啊,找了半天没有发现这个地方写错了,还要更认真才好

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧