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

📄 test.asm

📁 汇编语言 参考书 包含作业与答案 从入门到精通 通俗易懂
💻 ASM
字号:
;╔━┅━┅━┅━┅━┅━┅━┅━┅━━┅━┅━┅━┅━┅━┅━ ╗
;┃≡DosEditer V0.1		-----powered by BlasterKai! ≡ ┃
;┃ - ¤╭⌒╮ ╭⌒╮                                          ┃
;┃ ╱◥██◣ ╭ ⌒                                           ┃
;┃ |田︱田田| ╰---------一切都精彩-------缘自Buaa!!        ┃
;┃︵﹏~︵﹏~︵﹏~︵﹏~︵﹏~︵                            ┃
;╚┅━┅━┅━┅━┅━┅━┅━┅━┅━┅━┅━┅━┅━┅━┅━ ╝
;
;━┅━┅━┅━┅━┅━┅━┅━┅━━┅━┅━┅━┅━┅━┅━┅━
;DosEditer V0.2		---2004.11.16		
;	update:	1。修正键盘控制		2。对界面进行重新规划	
;----------------------------------------------------------------
;DosEditer V0.3		---2004.11.28		
;	update:	1。加入日期信息显示	2。实现文件读写模块		
;----------------------------------------------------------------
;━┅━┅━┅━┅━┅━┅━┅━┅━━┅━┅━┅━┅━┅━┅━┅━
	.model 	small
	
	stack	segment	stack
		WORD	100 DUP(?)
	STACK 	ENDS

	DATA	SEGMENT	PARA
		UP_INDENT	EQU	2
		DOWN_INDENT	EQU	26
		ROW		byte	2
		COL		byte	0

		head_menu	byte	' File	Edit	Help','$'
		foot_info	byte	' F1 Active help',6 DUP(' '),'F2 Active file',12 DUP(' '),'ESC to exit','$'
		msg_date	byte	'Date: ','$'
		msg_row		byte	'Row: ','$'
		msg_col		byte	'Col: ','$'
		filename	byte	'd:\dict.txt',0
		save_filename	byte	'd:\dictx.txt',0

		handle		word	0
		count_buffer	byte	5 DUP(0),'$'
		DATA_BUFFER	BYTE	124 DUP(0),'$'	
		buffer_len	EQU	$-data_buffer
		;DATA_TEMP	BYTE	0DH,0AH,' You didn’t write the code, or you wrote it in a past life.','$'	
		data	ENDS

	CODE	SEGMENT	PARA
		ASSUME	CS:CODE,DS:DATA,SS:STACK
	MAIN	PROC	FAR
		MOV	AX,DATA		;初始化DS,ES
		MOV	DS,AX
		MOV	ES,AX

		MOV	AX,0600H
		MOV	BH,30H
		MOV	CX,0000H
		MOV	DX,1B4fH	;30*80
		INT 10H
		
		CALL	CLEAR_SCREEN
		call	disp_head_foot
		call	show_date

		call	open_file
		call	READ_FILE
		call	close_file
		
		CALL	SET_CURSOR
		CALL	DISP_DATA
	NEXT:
		CALL	SET_CURSOR
		CALL	DEAL_KEYBRD
		CMP	AH,01H
		JNE	NEXT
		CALL	CLEAR_SCREEN

		call	save_file
		call	CLOSE_FILE

		CALL	RETURN

	MAIN	ENDP
;********************************************************
	disp_head_foot	proc	near
		mov	bx,word ptr row
		
		mov	row,0
		mov	col,0
		call	SET_CURSOR
		mov	dx,offset head_menu
		mov	ah,09h
		int 21h

		mov	row,27
		mov	col,0
		call	SET_CURSOR
		mov	dx,offset foot_info
		mov	ah,09h
		int 21h

		mov	word ptr row,bx
		ret
	disp_head_foot	endp
;********************************************************
	CLEAR_SCREEN	PROC	NEAR
		
		MOV	AX,0600H
		MOV	BH,10H
		MOV	CX,0100H
		MOV	DX,1A4fH	;30*80
		INT 10H

		RET
	CLEAR_SCREEN	ENDP
;********************************************************
	SET_CURSOR	PROC	NEAR
		MOV	AH,2H
		XOR	BH,BH
		MOV	DH,ROW
		MOV	DL,COL
		INT 10H

		RET
	SET_CURSOR	ENDP
;*******************************************************
	DISP_DATA	PROC	NEAR
		MOV	AX,1301H	;
		MOV	BX,0016H
		LEA	BP,DATA_BUFFER
		MOV	CX,buffer_len
		MOV	DH,ROW
		MOV	DL,COL
		INT 10H

		RET
	DISP_DATA	ENDP
;*******************************************************
	DISP_CHAR	PROC	NEAR
		LEA	BP,DATA_BUFFER
		ADD	BP,BX
		MOV	CX,buffer_len
		SUB	CX,BX
		MOV	AX,1301H	;
		MOV	BX,0016H
		MOV	DH,ROW
		MOV	DL,COL
		INT 10H

		RET
	DISP_CHAR	ENDP
;********************************************************
	DEAL_KEYBRD	PROC	FAR
		MOV	AH,0H		;从键盘读取一个字符
		INT 16H			;AH扫描,AL字符码
		push	ax
;-----------------------
	LEFT:		
		CMP	AH,4BH		;左箭头
		JNE 	RIGHT
		CALL	DEAL_KEY_LEFT
		JMP	DEALOK
	RIGHT:
		CMP	AH,4DH		;右箭头
		JNE	UP
		CALL	DEAL_KEY_RIGHT
		JMP	DEALOK
	UP:
		CMP	AH,48H		;上箭头
		JNE	DOWN
		CALL	DEAL_KEY_UP
		JMP	DEALOK	
	DOWN:
		CMP	AH,50H		;下箭头
		JNE	home
		CALL	DEAL_KEY_DOWN
		JMP	DEALOK
	HOME:
		CMP	AH,47H		;HOME
		JNE	ENDkey
		CALL	DEAL_KEY_HOME
		JMP	DEALOK
	ENDkey:
		CMP	AH,4FH		;END
		JNE	enterkey
		CALL	DEAL_KEY_END
		JMP	DEALOK
	ENTERkey:
		cmp	ah,1ch		;回车
		jne	delete
		call	deal_key_enter
		jmp	dealok
	DELETE:
		CMP	AH,53H		;删除
		JNE	BACK
		CALL	DEAL_KEY_DELETE
		JMP	DEALOK
	BACK:
		CMP	AH,0EH		;退格
		JNE	f1
		CALL	DEAL_KEY_BACK
		JMP	DEALOK
;--------------------	
	F1:
		cmp	ah,3bh
		jne	F2
		;call	deal_F1
		jmp	dealok
	F2:
		cmp	ah,3bh
		jne	F3
		;call	deal_F2
		jmp	dealok
	F3:
		cmp	ah,3bh
		jne	ascii
		;call	deal_F3
		jmp	dealok
;---------------------
	ascii:
		CALL	ASCII_CHAR
		JMP	DEALOK
	DEALOK:
		call	show_cursor_num	
		pop	ax
		RET	
	DEAL_KEYBRD 	ENDP
;********************************************************
	DEAL_KEY_LEFT	PROC	NEAR	;左箭头处理
		CMP	COL,0
		JBE	OUTcol
		DEC	COL
		JMP	DEALOK
	OUTcol:
		cmp	row,2
		jbe	outrow
		CALL	DEAL_KEY_UP		;只到上一行最右
		jmp	movend
	outrow:					;到达屏幕左上角,则移到右下角
		mov	row,26
	movend:	
		CALL	DEAL_KEY_END
	DEALOK:
				
		RET
	DEAL_KEY_LEFT	ENDP
;********************************************************
	DEAL_KEY_RIGHT	PROC	NEAR	;右箭头处理
		CMP	COL,79
		JAE	OUTcol
		INC	COL
		JMP	DEALOK
	OUTcol:
		cmp	row,26
		jae	outrow
		CALL	DEAL_KEY_DOWN		;只到上一行最左
		jmp	movend
	outrow:
		mov	row,2			;到达屏幕右下角,则移到左上角
	movend:	
		CALL	DEAL_KEY_HOME
	DEALOK:	
	
		RET
	DEAL_KEY_RIGHT	ENDP
;********************************************************
	DEAL_KEY_UP	PROC	NEAR	;上箭头处理
		CMP	ROW,UP_INDENT
		JBE	OUTLINE
		DEC	ROW
		JMP	DEALOK
	OUTLINE:
		
	DEALOK:	
		RET
	DEAL_KEY_UP	ENDP
;********************************************************
	DEAL_KEY_DOWN	PROC	NEAR	;下箭头处理
		CMP	ROW,DOWN_INDENT
		JAE	OUTLINE
		INC	ROW
		JMP	DEALOK
	OUTLINE:
		
	DEALOK:	
		RET
	DEAL_KEY_DOWN	ENDP
;********************************************************
	DEAL_KEY_HOME	PROC	NEAR	;HOME处理
		MOV	COL,0
		CALL	SET_CURSOR
		
		RET
	DEAL_KEY_HOME	ENDP
;*******************************************************
	DEAL_KEY_END	PROC	NEAR	;END处理
		MOV	COL,79
		CALL	SET_CURSOR
		
		RET
	DEAL_KEY_END	ENDP
;*******************************************************
	deal_key_enter	PROC	NEAR	;回车键处理
		cmp	row,26
		jae	dealok
		inc 	row
		call	DEAL_KEY_HOME
	dealok:		
		RET
	deal_key_enter	ENDP	
;*******************************************************
	DEAL_KEY_DELETE	PROC	NEAR	;删除键处理
		MOV	BL,COL
		XOR	BH,BH
		PUSH	BX
		MOV	BL,ROW
		PUSH	BX
;--------------		
		MOV	AL,ROW
		SUB	AL,2H
		MOV	BL,4FH
		MUL	BL

		MOV	BL,COL
		ADD	BX,AX
		;DEC	buffer_len

		MOV	CX,buffer_len
		SUB	CX,BX
		LEA	DI,[DATA_BUFFER+BX]
		LEA	SI,[DATA_BUFFER+BX+1]
	NEXT:
		LODSB
		STOSB
		LOOP	NEXT
		
		MOV	ROW,2
		MOV	COL,0
		CALL	DISP_DATA
		;INC	COL
		;CALL	SET_CURSOR
;---------------------
		POP	BX
		MOV	ROW,BL
		POP	BX
		MOV	COL,BL
		CALL	SET_CURSOR		
		
		RET
	DEAL_KEY_DELETE	ENDP
;*******************************************************
	DEAL_KEY_BACK	PROC	NEAR	;后退键处理
		cmp	col,0
		je	outrow
		dec	col
		jmp	dealok
	outrow:
		dec	row
		call	DEAL_KEY_END
	dealok:	
		call DEAL_KEY_DELETE
		
		RET
	DEAL_KEY_BACK	ENDP
;*******************************************************
	ASCII_CHAR	proc	near
		cmp	al,20h			;显示ASCII码大于20小于7EH的字符
		jb	asciiok
		cmp	al,7eh
		ja	asciiok	

		;mov	dl,al
		;mov	ah,02h
		;int 21h
		xor	bh,bh			;在光标位置显示字符
		mov	bl,6h
		mov	al,al
		mov	ah,0eh
		int 10h
		
	asciiok:
		ret
	ASCII_CHAR	endp
;******************************************************
	show_date	proc	near
		push	word ptr row
		
		mov	row,0
		mov	col,64
		call	SET_CURSOR
		
		mov	ah,2ah			;取得系统日期
		int 21h			;AL星期,DL日,DH月,CX年
		push	cx
		push	dx		;保存取得的日期
		push	dx

		
		mov	dx,offset msg_date
		mov	ah,09h
		int 21h
		add	col,6		
		call	SET_CURSOR
		;xor	ah,ah		;暂不显示星期几
		;call	deal_num
		;add	col,3
		;call	SET_CURSOR
		
		pop	dx
		xor	ah,ah
		mov	al,dh		;输出月
		call	deal_num		
		add	col,2
		call	SET_CURSOR
		
		mov	dl,'/'
		mov	ah,02h
		int 21h
		
		pop	dx
		xor	ah,ah
		mov	al,dl		;输出日
		call	deal_num
		add	col,4
		call	SET_CURSOR
		
		pop	cx
		mov	ax,cx		;输出年
		call	deal_num
		
		pop	word ptr row		
		ret
	show_date	endp
;*******************************************************
	show_cursor_num	proc	near
		push	word ptr row
;--------------------
		MOV	AX,0600H		;清除原有计数显示
		MOV	BH,30H
		MOV	CX,1b3cH
		MOV	DX,1B4fH	;30*80
		INT 10H
;---------------------
		push	word ptr row
		push	word ptr row		;设置光标于行列值处
		mov	row,27
		mov	col,64
		call	SET_CURSOR

		mov	dx,offset msg_row
		mov	ah,09h
		int 21h
		add	col,5
		call	SET_CURSOR

		pop	word ptr row
		mov	al,row
		xor	ah,ah
		dec	ax			;有丙行为菜单栏,不计入
		call	deal_num

						;设置光标于行列值处
		mov	row,27
		mov	col,72
		call	SET_CURSOR
		
		mov	dx,offset msg_col
		mov	ah,09h
		int 21h
		add	col,5
		call	SET_CURSOR

		pop	word ptr row
		mov	al,col
		xor	ah,ah
		inc	ax			;系统是从0开始计数的,所以要加1
		call	deal_num				
;-----------------------
		pop	word ptr row
		ret
	show_cursor_num	endp
;********************************************************
	DEAL_NUM	PROC	NEAR		;将一个字转换成十进制并输出子程序
		push	di
		
		MOV     CX,5
		
	        MOV     BX,10
	        MOV     DI,OFFSET count_buffer+4	;从后往前保存

	LP4:    XOR     DX,DX			;将DX清零 
	        DIV     BX
	        OR      DL,30H			;也可用ADD DL,30H	
	        MOV     BYTE PTR [DI],DL	;将16进制的数转换到ASCII中对应的数,0的ASCII码为 30H (48D)
	        CMP	AX,0
	        JZ	PRINT			;当商为0时,直接去打印,可不打印高位的0.
	        DEC     DI
	        LOOP    LP4
	PRINT:
	        MOV     DX,DI			;从DI开始打印,因为RESULT不一定够5位
	        MOV     AH,9
	        INT     21H			;调用DOS的21号中断的9号功能,将DB输出

		pop	di
	        RET
	DEAL_NUM	ENDP
;*********************************************************
	open_file	proc	near
		lea	dx,filename		;打开所读文件
		mov	al,2
		mov 	ah,3dh
		INT 	21h
		;jc	open_error
		mov	handle,ax		;保存文件句柄

	open_file	endp
;******************************关闭文件****************
	READ_FILE	proc	near
		mov	bx,handle
		mov 	cx,buffer_len		;N个字节
		lea	dx,data_buffer
		mov 	ah,3fh
		INT 	21h
		;jc	read_error			

		ret
	READ_FILE	endp

;******************************************************
	save_file	proc	near
		push	word ptr row
;---------------------
		lea	dx,save_filename		;打开所读文件
		mov	al,2
		mov 	ah,3dh
		INT 	21h
		;jc	open_error
		mov	handle,ax		;保存文件句柄
		
		mov	row,UP_INDENT
		mov	col,DOWN_INDENT
		lea	di,data_buffer
	
		mov	cx,buffer_len
		xor	bh,bh
	next_char:
		mov	ah,08h
		int 10h

		mov	[di],ah
		inc	di
		call	DEAL_KEY_RIGHT
		loop	next_char
;----------------------
		lea	di,data_buffer
		mov	bx,handle
		mov	cx,buffer_len
		mov	ah,40h
		int 21h

;----------------------		
		pop	word ptr row
		ret
	SAVE_FILE	endp
;*******************************************************
	CLOSE_FILE	PROC	NEAR
		MOV	AH,3EH
		MOV	BX,HANDLE
		INT 21H
		
		RET
	CLOSE_FILE	ENDP
;*******************************************************




















	
;********************************************************
	RETURN	PROC	NEAR
		MOV	AX,4C00H
		INT 21H
		
		RET
	RETURN	ENDP
;*******************************************************	
	CODE	ENDS
		END	MAIN

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -