📄 myview_.asm
字号:
.286
.model small
.data
ERRMSG DB 'Error!$'
WARNING DB 'USAGE:MYVIEW < FILE PATH AND NAME>$'
buffer db 10h DUP (?)
filename db 80h DUP (0)
HSOURCE dw 0
pageid dw 0
ph dw 0
pl dw 0
num dw 0
.stack 100h
.code
print macro value ;显示一个字节
push ax
mov ah, 0eh
mov al, value
int 10h
pop ax
endm
location macro row,col ;在屏幕上定位光标
MOV AH, 2H
MOV BH, 0
MOV DX, row
ROL DX, 8
MOV DL, col
INT 10H
endm
PrintENTER MACRO ;输出回车
MOV AX, 0E0DH
INT 10H
MOV AX, 0E0AH
INT 10H
ENDM
@JZ MACRO ADDRESS
JNZ $+5
JMP ADDRESS
NOP
ENDM
@JB MACRO ADDRESS
JNB $+5
JMP ADDRESS
NOP
ENDM
clscrean macro
push ax
MOV AX, 2H ;清屏
INT 10H
pop ax
endm
start:
MOV AX, @DATA
MOV DS, AX
MOV AL, ES:[80H] ;初始化,取命令行参数长度
MOV DI, 0
XOR AH, AH
XOR SI, SI
CMP DI, AX
@JZ ERROR
TrimLeft: ;去掉前导空格
MOV CL, ES:[DI+81H]
CMP CL, 20H
JNZ SourceFileName
INC DI
JMP TrimLeft
SourceFileName: ;取文件名
MOV CL, ES:[DI+81H]
CMP DI, AX
@JZ openfile
MOV filename[SI],CL
INC DI
INC SI
JMP SourceFileName
openfile:
LEA DX, filename ;打开源文件
MOV AX, 3D00H
INT 21H
@JB ERROR
MOV HSOURCE, AX
MOV PAGEID, 0
CLS:
clscrean
;mov ax, 0600h
;mov bh, 1eh
;mov cx, 0
;int 10h
MOV AX, 100H
MUL PAGEID
MOV CX, DX ;高位
MOV DX, AX
MOV PH, CX
MOV PL, DX
AGAIN: clscrean
;mov ax, 0600h
;mov bh, 1eh
;mov cx, 0
;int 10h
MOV AX, 4200H
MOV BX, HSOURCE
MOV CX, PH
MOV DX, PL
INT 21H ;移动文件指针
@JB ERROR
XOR DI, DI ;DI是行计数器
READ:
MOV AH, 3FH ;读源文件
MOV BX, HSOURCE
MOV CX, 10H
LEA DX, BUFFER
INT 21H
@JB ERROR
PUSH AX ;AX是实际读出的字节数
MOV BX, AX
MOV AX, PH ;输出地址
ROL AX, 8
CALL HEX_PUT
ROL AX, 8
CALL HEX_PUT
PRINT ':'
MOV AX, NUM
ROL AX, 8
CALL HEX_PUT
ROL AX, 8
CALL HEX_PUT
;ADD PL, 10H
PRINT ' '
PRINT ' '
XOR SI, SI ;SI是列计数器
SHOW: ;显示16进制代码
CMP SI, BX ;是否到一行尾
@JZ PRESHOWCHAR
MOV AL, DS:[BUFFER+SI]
CALL HEX_PUT
PRINT 20H
INC SI
JMP SHOW
PRESHOWCHAR:
location di,60
XOR SI, SI ;SI还是列计数器
SHOWCHAR: ;显示ASCII字符
CMP SI, BX
@JZ NEXTLINE ;一行显示完的话,就可以显示下一行了
MOV AL, DS:[BUFFER+SI] ;BUFFER是缓冲区首地址
CMP AL, 20H ;如果比20H还小则代表功能字符,不能直接显示,改用“.”
JNB COMMON
MOV AL, '.'
COMMON:
MOV AH, 0EH
INT 10H
INC SI
JMP SHOWCHAR
NEXTLINE:
POP DX
CMP DX, 10H ;上一行如果到文件尾
JNE WAITKEY ;等待按键
INC DI ;行计数器加1
CMP DI ,10H ;每页显示16行,够数后则等待按键
JE WAITKEY
PRINTENTER ;换行,准备输出下一行
ADD NUM, 10H
CMP NUM, 0FFF0H
JZ JINWEI
JMP READ
WAITKEY:
XOR AH, AH
INT 16H ;等待用户按键
CMP AX, 4900H ;PageUp键
JZ PAGEUP
CMP AX, 5100H ;PageDown键
JZ PAGEDOWN
CMP AX, 5000H ;DOWN键
JZ DOWN
CMP AX, 4800H ;UP键
JZ UP
CMP AL, 1BH ;ESC键
JNZ WAITKEY ;其它键则忽略
FINISH:
MOV AH, 3EH ;关闭文件
MOV BX, HSOURCE
INT 21H
QUIT:
PRINTENTER
MOV AH, 4CH
INT 21H
PAGEUP:
CMP pl, 0F0h ;是否为第一页
JNG WAITKEY ;是第一页,什么也不做
SUB pl, 100h ;不是第一页,页号减1
SUB NUM, 1F0H
PrintENTER
JMP AGAIN
PAGEDOWN:
CMP DX, 10H ;文件是否读完了(从而知道是否是最后一页)
JNZ WAITKEY ;读完了
ADD pl, 100h ;没读完,页号加1
SUB NUM, 0F0H
ADD NUM, 100H
PrintENTER
JMP AGAIN
DOWN: CMP DX, 10H ;文件是否读完了
JNZ WAITKEY
ADD pl, 10h
SUB NUM, 0F0H
ADD NUM, 10H
PrintENTER
JMP AGAIN
UP: CMP pl, 00h
JZ WAITKEY
SUB pl, 10H
SUB NUM, 100H
PrintENTER
JMP AGAIN
JINWEI: PUSH AX
MOV NUM, 0
MOV PH, 10H
JMP READ
ERROR:
LEA DX, ERRMSG
MOV AH, 9
INT 21H
PrintENTER
LEA DX, WARNING
MOV AH, 9
INT 21H
JMP QUIT
HEX_PUT PROC
PUSH CX
PUSH DX
PUSH AX
MOV DL, AL
MOV CX, 2
MOV AH, 0EH
HEX_NEXT:
ROL DL, 4
MOV AL, DL
AND AL, 0FH
DAA
ADD AL, 0F0H
ADC AL, 040H
INT 10H
LOOP HEX_NEXT
POP AX
POP DX
POP CX
RET
HEX_PUT ENDP
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -