DATA SEGMENT DIGIT DB "DIGIT",0AH,0DH LETTER DB "LETTER",0AH,0DH OTHER DB "OTHER",0AH,0DH DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AH,07 INT 21H CMP AL,30H JB AA1 CMP AL,39H JA AA1 MOV CX,7 LEA SI,DIGIT AA0: MOV DL,[SI] MOV AH,2 INT 21H INC SI LOOP AA0 JMP BB AA1: CMP AL,41H JB AA3 CMP AL,5AH JA AA2 LEA SI,LETTER MOV CX,8 AA4: MOV DL,[SI] MOV AH,2 INT 21H INC SI LOOP AA4 JMP BB AA2: CMP AL,61H JB AA3 CMP AL,7AH JA AA3 LEA SI,LETTER MOV CX,8 AA5: MOV DL,[SI] MOV AH,2 INT 21H INC SI LOOP AA5 JMP BB AA3: LEA SI,OTHER MOV CX,7 AA6: MOV DL,[SI] MOV AH,2 INT 21H INC SI LOOP AA6 BB: MOV AH,4CH INT 21H CODE ENDS ENDSTART 这个代码有什么问题 应该如何修改
时间: 2023-07-02 16:17:38 浏览: 111
这段代码有一些问题:
1. 在比较 AL 和 30H、39H 时,应该使用无符号比较(JC、JA),因为 AL 存储的是 ASCII 码值,可能会出现负数值。
2. 在判断 AL 是否为字母时,应该先判断是否为大写字母,再判断是否为小写字母,因为它们的 ASCII 码值不连续。
3. 在输出 "LETTER" 时,应该使用 LETTER 标签,而不是 DIGIT 标签。
4. 在循环输出字符串时,应该判断字符串是否已经结束,否则可能会输出一些奇怪的字符。
下面是修改后的代码:
```
DATA SEGMENT
DIGIT DB "DIGIT",0AH,0DH
LETTER DB "LETTER",0AH,0DH
OTHER DB "OTHER",0AH,0DH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,07
INT 21H
; 判断是否为数字
CMP AL, '0'
JC AA1
CMP AL, '9'
JA AA1
; 输出 "DIGIT"
MOV CX, 5
LEA SI, DIGIT
AA0:
MOV DL, [SI]
MOV AH, 02H
INT 21H
INC SI
LOOP AA0
JMP BB
AA1:
; 判断是否为大写字母
CMP AL, 'A'
JC AA3
CMP AL, 'Z'
JA AA2
; 输出 "LETTER"
LEA SI, LETTER
MOV CX, 6
AA4:
MOV DL, [SI]
MOV AH, 02H
INT 21H
INC SI
LOOP AA4
JMP BB
AA2:
; 判断是否为小写字母
CMP AL, 'a'
JC AA3
CMP AL, 'z'
JA AA3
; 输出 "LETTER"
LEA SI, LETTER
MOV CX, 6
AA5:
MOV DL, [SI]
MOV AH, 02H
INT 21H
INC SI
LOOP AA5
JMP BB
AA3:
; 输出 "OTHER"
LEA SI, OTHER
MOV CX, 7
AA6:
MOV DL, [SI]
MOV AH, 02H
INT 21H
INC SI
LOOP AA6
BB:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
```
阅读全文