几条汇编语言,高手来帮忙解释下,谢谢!是一个完整的程序,请给每一句注释,主要是begin前的。

2024-12-23 12:24:03
推荐回答(1个)
回答1:

EXTRN LOAD:FAR,SAVE:FAR
N EQU 20
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DB N DUP(?)
RESULT DB N DUP(0)
NAME0 DB 'INPUT1.DAT',0
NAME1 DB 'OUTPUT1.DAT',0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STAC
START PROC FAR
PUSH DS ;将段地址压入堆栈
XOR AX,AX ;ax清0
PUSH AX ;将偏移地址0压入堆栈(这3句是为了使指针回到DOS)
MOV AX,DATA ;-
MOV DS,AX ;ds通过这2句安装
LEA DX,SOURCE ; 数据区起始地址
LEA SI,NAME0 ; 原始数据文件名
MOV CX,N ; 字节数
CALL LOAD ; 从 'INPUT.DAT'中读取数据
; **** BEGIN **** ;BEGIN和END中间的不用注释
LEA SI,SOURCE
LEA DI,RESULT ; ①
MOV CX,N ; ②
NEXT: MOV AL,[SI]
CMP AL,'0'
JB INVALID ; ③
CMP AL,'9' ; ④
JBE STRIP ; ⑤
CMP AL,'A'
JB INVALID
CMP AL, 'F' ; ⑥
JA INVALID ; ⑦
ADD AL,9
STRIP: AND AL,0FH; ; ⑧
INVALID: MOV [DI],AL
ADD SI,1
ADD DI,1
LOOP NEXT ; ⑨
; **** END ****
LEA DX,RESULT ; 结果数据区首址
LEA SI,NAME1 ; 结果文件名
MOV CX,N ; 结果字节数
CALL SAVE ; 保存结果到文件
RET
START ENDP
CODE ENDS
END START

NAME0 DB 'INPUT1.DAT',0 是使'INPUT1.DAT'得初始值为0

可以理解是,每个程序编完都会在DOS下运行,AX的值是DOS下指针的偏移量,它的初始值当然是0(从第一条开始开始),为了保护现场就要借用堆栈了。