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 + -
显示快捷键?