98_hzk_gb2312_v1.2_2005.1.20.asm

来自「汇编语言 参考书 包含作业与答案 从入门到精通 通俗易懂」· 汇编 代码 · 共 533 行 · 第 1/2 页

ASM
533
字号
		CMP	AX,0
		JZ	CANNOTDIV_X
		DIV	BL
		MOV	DH,AL
		JMP	GET_Y
CANNOTDIV_X:
		MOV	DH,0
GET_Y:
		MOV	AX,LINEY
		CMP	AX,0
		JZ	CANNOTDIV_Y
		MOV	BL,8
		DIV	BL
		MOV	DL,AL
		JMP	POSITIONISOK
CANNOTDIV_Y:
		MOV	DL,0	
POSITIONISOK:
		MOV	AH,2H
		INT	10H

		MOV DX,BUFFER_READ
		MOV AH,2H
		INT 21H
	
		JMP	CHANGE
;;****************************************************************  ;错误处理程序		
OPEN_CCLIB_ERROR:	LEA	DX,MSG_OPEN_CCLIB_ERROR
			JMP	MSGSHOW
OPEN_READ_ERROR:	LEA	DX,MSG_OPEN_READ_ERROR
			JMP	MSGSHOW
READ_CCLIB_ERROR:	LEA	DX,MSG_READ_CCLIB_ERROR
			JMP	MSGSHOW
READ_READ_ERROR:	LEA	DX,MSG_READ_READ_ERROR
MSGSHOW:
		MOV AH,9H
		INT 21H
		JMP DONEWITHOUTCLOSE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;		
DONE:
		MOV     AX,3E00H
		MOV     BX,HANDLE_CCLIB
		INT     21H
		MOV     AX,3E00H
		MOV     BX,HANDLE_READ
		INT     21H

		MOV     AH,00H
		INT     16H
		MOV     AX,0003H		;在WINDOWS下不用此结束后会产生花屏
		INT     10H
DONEWITHOUTCLOSE:
		MOV AH,4CH
		INT 21H
MAIN	ENDP
		

;;*************************************************************************
;;*************************************************************************
;;*************************************************************************
;;*************************************************************************
GET_FILE_NAME	PROC	NEAR
		LEA	DX,INPUTFILENAME				;调用 21号中断的A号功能,读入文件名及路径信息
		MOV	AH,9
		INT	21H
		MOV	DX,OFFSET MAXLEN
		MOV	AH,0AH
		INT	21H
		MOV	SI,OFFSET FILENAME
		MOV	BL,ACTLEN
		XOR	BH,BH
		ADD	SI,BX
		XOR	BX,BX
		MOV	[SI],BX

		MOV	DL,0AH			;输出一个回车符
		MOV	AH,2
		INT	21H

		LEA	DX,INPUTMODEL					;再读入字型转置方式,默认为正常显示
		MOV	AH,9
		INT	21H
		MOV	AH,1
		INT	21H
		MOV	MODEL,AL

		MOV	DL,0AH			;输出一个回车符
		MOV	AH,2
		INT	21H

		RET
GET_FILE_NAME	ENDP
;;****************************************************************  ;正常显示汉字子程序
PRINT_NORMAL	PROC	NEAR					
		MOV	DX,LINEX		;设置X轴的坐标
		MOV	CX,16			;每个汉字显示为16行
		LEA	SI,BUFFER_CCLIB
WRITEX:
		PUSH	CX
		MOV	BX,LINEY		;设置Y轴的坐标
		;;;;;;;;;;
		MOV	CX,16			;一个汉字为16列,此为第一个字节显示
		MOV	AH,[SI]
		MOV	AL,[SI+1]
WRITEY:
		SHL	AX,1
		PUSH	AX
		JC	ISZERO			;在1.0版中,由于PUSH的位置不对,误认为
		XOR	AL,AL			;SHL只能用于字节的移位,对SHL的理解不够,使子程序长了近一倍。
		JMP	GOON
ISZERO:
		MOV	AL,7H
GOON:
		MOV	AH,0CH
		XCHG	CX,BX
		PUSH	BX
		XOR	BX,BX
		INT	10H
		POP	BX
		XCHG	CX,BX	
		POP	AX
		
		INC	BX		;BX代替CX来计算列地址,右移一列
		LOOP	WRITEY
	;;;;;;;;;;;;;;;;
		POP	CX
		INC	DX		;DX为行地址,下移一行
		INC	SI
		INC	SI
		LOOP	WRITEX		;开始行循环

		RET
PRINT_NORMAL	ENDP
;;****************************************************************  ;左转90度显示汉字子程序
PRINT_LEFT	PROC	NEAR					
		MOV	BX,LINEY		;设置X轴的坐标
		;ADD	BX,16
		MOV	CX,16			;每个汉字显示为16行
		LEA	SI,BUFFER_CCLIB
WRITEX:
		PUSH	CX
		MOV	DX,LINEX		;设置Y轴的坐标
		ADD	DX,16
		;;;;;;;;;;
		MOV	CX,16			;一个汉字为16列,此为第一个字节显示
		MOV	AH,[SI]
		MOV	AL,[SI+1]
WRITEY:
		SHL	AX,1
		PUSH	AX
		JC	ISZERO			;在1.0版中,由于PUSH的位置不对,误认为
		XOR	AL,AL			;SHL只能用于字节的移位,对SHL的理解不够,使子程序长了近一倍。
		JMP	GOON
ISZERO:
		MOV	AL,7H
GOON:
		MOV	AH,0CH
		XCHG	CX,BX
		PUSH	BX
		XOR	BX,BX
		INT	10H
		POP	BX
		XCHG	CX,BX	
		POP	AX
		
		DEC	DX		;BX代替CX来计算列地址,右移一列
		LOOP	WRITEY
	;;;;;;;;;;;;;;;;
		POP	CX
		INC	BX		;DX为行地址,下移一行
		INC	SI
		INC	SI
		LOOP	WRITEX		;开始行循环

		RET
PRINT_LEFT	ENDP
;;****************************************************************  ;右转90度显示汉字子程序
PRINT_RIGHT	PROC	NEAR
		MOV	BX,LINEY		;设置X轴的坐标
		ADD	BX,16
		MOV	CX,16			;每个汉字显示为16行
		LEA	SI,BUFFER_CCLIB
WRITEX:
		PUSH	CX
		MOV	DX,LINEX		;设置Y轴的坐标
		;ADD	DX,16
		;;;;;;;;;;
		MOV	CX,16			;一个汉字为16列,此为第一个字节显示
		MOV	AH,[SI]
		MOV	AL,[SI+1]
WRITEY:
		SHL	AX,1
		PUSH	AX
		JC	ISZERO			;在1.0版中,由于PUSH的位置不对,误认为
		XOR	AL,AL			;SHL只能用于字节的移位,对SHL的理解不够,使子程序长了近一倍。
		JMP	GOON
ISZERO:
		MOV	AL,7H
GOON:
		MOV	AH,0CH
		XCHG	CX,BX
		PUSH	BX
		XOR	BX,BX
		INT	10H
		POP	BX
		XCHG	CX,BX	
		POP	AX
		
		INC	DX		;BX代替CX来计算列地址,右移一列
		LOOP	WRITEY
	;;;;;;;;;;;;;;;;
		POP	CX
		DEC	BX		;DX为行地址,下移一行
		INC	SI
		INC	SI
		LOOP	WRITEX		;开始行循环

		RET
PRINT_RIGHT	ENDP
;;****************************************************************  ;倒转显示汉字子程序
PRINT_REVERSE	PROC	NEAR
		MOV	DX,LINEX		;设置X轴的坐标
		ADD	DX,16
		MOV	CX,16			;每个汉字显示为16行
		LEA	SI,BUFFER_CCLIB
WRITEX:
		PUSH	CX
		MOV	BX,LINEY		;设置Y轴的坐标
		ADD	BX,16
		;;;;;;;;;;
		MOV	CX,16			;一个汉字为16列,此为第一个字节显示
		MOV	AH,[SI]
		MOV	AL,[SI+1]
WRITEY:
		SHL	AX,1
		PUSH	AX
		JC	ISZERO			;在1.0版中,由于PUSH的位置不对,误认为
		XOR	AL,AL			;SHL只能用于字节的移位,对SHL的理解不够,使子程序长了近一倍。
		JMP	GOON
ISZERO:
		MOV	AL,7H
GOON:
		MOV	AH,0CH
		XCHG	CX,BX
		PUSH	BX
		XOR	BX,BX
		INT	10H
		POP	BX
		XCHG	CX,BX	
		POP	AX
		
		DEC	BX		;BX代替CX来计算列地址,右移一列
		LOOP	WRITEY
	;;;;;;;;;;;;;;;;
		POP	CX
		DEC	DX		;DX为行地址,下移一行
		INC	SI
		INC	SI
		LOOP	WRITEX		;开始行循环

		RET
PRINT_REVERSE	ENDP
;;********************************************************************************************
.exit
	END	main					

⌨️ 快捷键说明

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