修改汇编程序

来源:百度知道 编辑:UC知道 时间:2024/09/23 01:29:23
这个程序很简单的,连续放着20个ASCII字符,如果是小写字母A~Z之间的字符,请把它们转换成相应的小写字母:若为其他字符,均转换成ASCII字符'NUL' (00H)。 就是这个, 我用的是MASM5在 DOS状态下汇编,运行, 但是在DOS下显示不出运行结果。我不知道怎么弄了 ,帮我改一下啊!

我听说要在DOS下显示结果要这个东西MOV AH,4CH INT 21H,是不是啊,能简单明了的解释下什么意思吗? 还有我不想用DEBUG来 调试, 我只想在DOS下 显示出结果。

DATA SEGMENT
X DB 41H,42H,43H,44H,45H,46H,47H,48H,49H,50H,51H,52H,53H,54H,55H,5EH,64H,48H,76H,77H
Y DB 20 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA SI,X
LEA DI,Y
MOV CX,20
L1: MOV AL,[SI]
CMP AL,'A'
JB L2
CMP AL,'Z'
JA L2
ADD AL,20H
JMP L3
L2: MOV AL,0
JMP L3
L3: MOV [DI],AL
INC SI
INC DI
LOOP L1
MOV AH,4CH
INT 21H
CODE ENDS
END START

楼主这段程序写得不错,结构清晰,层次分明,已经正确地完成了字符的转换。只是在算法上略显不足,再就是没有显示输出。

针对这两点,在楼主原有程序的基础上,我给做了一下优化和补充(这部分,我用小写),仅供参考。

DATA SEGMENT
X DB 41H,42H,43H,44H,45H,46H,47H,48H,49H,50H,51H,52H,53H,54H,55H,5EH,64H,48H,76H,77H
Y DB 20 DUP(?)
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA
MOV DS,AX
LEA SI,X
LEA DI,Y
MOV CX,20
cld ;清方向标志,使变址寄存器增值
push ds
pop es ;使附加段与数据段在同一段位
L1: lodsb
CMP AL,'A'
JB L2
CMP AL,'Z'
JA L2
or AL,20H ;逻辑运算指令远比数据传送指令运行周期短、效率高
JMP L3
L2: xor al,al
JMP L3
L3: stosb
LOOP L1

;---------------------------
; 为显示输出做准备
mov byte ptr [si],0dh ;在源字符串后面加一个回车符
inc si
mov byte ptr [si],0ah ;在源字符串后面加一个换行符
inc si
mov al,'$'
mov [si],al ;在源字符串后面加一个字符串输出结束标志符,这是dos功能调用9号功能的要求
stosb ;在目标字符串后面加一个字符串输出结束标志符
;---------------------------
;