📄 rjexp18.asm
字号:
CRLF MACRO
MOV AH,02H
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
ENDM
DATA SEGMENT
FNAME DB 'DATA.AAA',0
MESS1 DB 0DH,0AH,'输入段址:$'
MESS2 DB 0DH,0AH,'输入偏移量:$'
EMESS DB 'ERROR $'
ERROR DB 0DH,0AH,'INPUT ERROR!',0DH,0AH,'$'
DATBUF DB 80 DUP(?)
DATA ENDS
STACK SEGMENT
STA DB 50 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK ;段寄存器和堆栈初始化
MOV SS,AX
MOV SP,TOP
MOV AH,09H
MOV DX,OFFSET MESS1
INT 21H ;显示提示信息1
CALL GETNUM
MOV BP,DX ;段址→BP
MOV AH,09H
MOV DX,OFFSET MESS2 ;显示提示信息2
INT 21H
CALL GETNUM
MOV SI,DX ;偏移量→SI
MOV AH,3CH
MOV CX,00H ;建立名为DATA.AAA的文件,文件属性为可读写
MOV DX,OFFSET FNAME
INT 21H
MOV BX,AX
JC ERRORPR ; 建立文件出错转ERRORRRR
CLD ; 清方向标志
VVV: MOV CX,0080 ;字符缓冲区DATBUF能容纳的最大字符数
MOV DS,BP ;DS指向内存数据区域段
MOV DI,OFFSET DATBUF ;缓冲区首址
UUU: LODSB ;从DS:SI取字符送AL
CMP AL,1AH ;若为结束字符`CTRL-Z`则转EEE
JE EEE
STOSB ;存于缓冲区DATBUF中
LOOP UUU
MOV AH,40H
MOV CX,0080
PUSH ES ;缓冲区DATBUF 中80个字符写入文件DATA.AAA中
POP DS
MOV DX,OFFSET DATBUF
INT 21H
JC ERRORPR ;出错转ERRORRR
JMP VVV
EEE: MOV SI,OFFSET DATBUF
SUB DI,SI ;缓冲区中存入
JE EXIT ;字符数为0,则转EXIT
MOV AH,40H
MOV CX,DI
PUSH ES ;将缓冲区中剩余字符写入文件
POP DS
MOV DX,OFFSET DATBUF
INT 21H
JC ERRORPR ;出错转ERRORPR
EXIT: MOV AH,3EH
INT 21H ;关闭文件
JC ERRORPR
MOV AX,4C00H
INT 21H ;返回DOS
ERRORPR:MOV BX,AX
MOV AH,09H ;显示出错信息
MOV DX,OFFSET EMESS
INT 21H
CALL BINIHEX ;显示出错代码
JMP EXIT
BINIHEX PROC NEAR
MOV CH,04 ;要显示的数据的位数
ROT: MOV CL,04
ROL BX,CL ;最高4位移到最低4位
MOV AL,BL
AND AL,0FH ;取低4位
ADD AL,30H ;变为ASCII码
CMP AL,3AH ;是否大于9
JL PRINT ;不大于9转PRINT
ADD AL,27H ;是A-F吗?
PRINT: MOV DL,AL
MOV AH,02 ;显示出错代码
INT 21H
DEC CH ;显示完4位数字否?
JNZ ROT ;未完则转ROT
RET ;返回
BINIHEX ENDP
GETNUM PROC NEAR
PUSH CX
XOR DX,DX
GGG: MOV AH,01H
INT 21H
CMP AL,0DH
JZ PPP
CMP AL,20H
JZ PPP
SUB AL,30H
JB KKK
CMP AL,0AH
JB GETS
CMP AL,11H
JB KKK
SUB AL,07H
CMP AL,0FH
JBE GETS
CMP AL,2AH ;键盘读入子程序
JB KKK
CMP AL,2FH
JA KKK
SUB AL,20H
GETS: MOV CL,04
SHL DX,CL
XOR AH,AH
ADD DX,AX
JMP GGG
KKK: MOV AH,09H
MOV DX,OFFSET ERROR
INT 21H
PPP: PUSH DX
CRLF
POP DX
POP CX
RET
GETNUM ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -