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

📄 97_editerindos_v0.2.asm

📁 汇编语言 参考书 包含作业与答案 从入门到精通 通俗易懂
💻 ASM
字号:
	.model 	small
	
	stack	segment	stack
		WORD	100 DUP(?)
	STACK 	ENDS

	DATA	SEGMENT	PARA
		UP_INDENT	EQU	2
		DOWN_INDENT	EQU	27
		DATALEN		WORD	205
		ROW		byte	2
		COL		byte	0

		head_menu	byte	' File	Edit	Help','$'
		foot_info	byte	' F1 Active help		F2 Active file','$'

		count_buffer	byte	5 DUP(0),'$'
		DATA_BUFFER	BYTE	'You have a multitude of source files spread out all over the place. You have to deal with functions that somebody else wrote. You have to figure out how some piece of code works and see all of its clients!','$'		;,1024 DUP(?),'$'		
		;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	SET_CURSOR
		CALL	DISP_DATA
	NEXT:
		CALL	SET_CURSOR
		CALL	DEAL_KEYBRD
		CMP	AH,01H
		JNE	NEXT
		CALL	CLEAR_SCREEN

		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,0200H
		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,DATALEN
		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,DATALEN
		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
		;CMP	AL,00H
		;JE	LEFT
		;CMP	AL,0E0H
		;JE	LEFT

		;CALL	ASCIICHAR
		;JMP	DEALOK
;-----------------------
	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	dealok
		;call	deal_F3
		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	DATALEN

		MOV	CX,DATALEN
		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
;*******************************************************
	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		;设置光标于行列值处
		mov	row,27
		mov	col,60
		call	SET_CURSOR
		pop	word ptr row

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

		push	word ptr row		;设置光标于行列值处
		mov	row,27
		mov	col,70
		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
;*********************************************************


























	
;********************************************************
	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 + -