⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myview_.asm

📁 汇编
💻 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 + -