一个时钟驻留程序中的PSP长度

来源:百度知道 编辑:UC知道 时间:2024/05/18 06:35:11
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 CURM

1. 11H 是 17字节 ,不是11字节(16进制)
2. PSP 长度是256字节
3. 11H 不是PSP长度
4. 正确计算公式

长度:(代码段长度+数据段长度+堆栈段长度+256(PSP长度)+15)/16

5.

MOV DX,OFFSET GO
SUB DX,OFFSET START // 这步完成后DX是要驻留的代码长度+数据段长度
MOV CL,4
SHR DX,CL // DX 右移4位(高->低) = /16
ADD DX,11H // (256(PSP长度)+15)/16 = 17(16.9)

你没使用独立的堆栈段

不懂。