Assembly 大写的下一个和上一个字符
我不熟悉组装,而且我正在使用DOSBox 我正试图用大写字母打印用户输入的小写字母的前后字母。(例如,如果用户输入Assembly 大写的下一个和上一个字符,assembly,x86,dos,dosbox,Assembly,X86,Dos,Dosbox,我不熟悉组装,而且我正在使用DOSBox 我正试图用大写字母打印用户输入的小写字母的前后字母。(例如,如果用户输入c,它将打印B和D) 但我的代码会打印奇怪的样本 我的代码: .MODEL SMALL .STACK 100H .DATA MSG1 DB "Enter a letter between a and z:$" MSG2 DB "The previous letter is:$" MSG3 DB "The next letter is:$
c
,它将打印B
和D
)
但我的代码会打印奇怪的样本
我的代码:
.MODEL SMALL
.STACK 100H
.DATA
MSG1 DB "Enter a letter between a and z:$"
MSG2 DB "The previous letter is:$"
MSG3 DB "The next letter is:$"
X DB ?
.CODE
MAIN PROC
; initialize DS
MOV AX, @DATA
MOV DS, AX
; print MSG1
LEA DX, MSG1
MOV AH, 9h
INT 21H
; read lowercase letter
MOV AH,1h
INT 21H
; save the letter X
MOV X, AL
; printing new line
MOV DL, 10
MOV AH, 02h
INT 21h
MOV DL, 13
MOV AH, 02h
INT 21h
; print MSG2
MOV AH, 9h
LEA DX, MSG2
INT 21H
; The previous letter
MOV DL, X
SUB DL, 1
ADD DL, 48
MOV AH, 2h
INT 21H
; print MSG3
MOV AH, 9h
LEA DX, MSG3
INT 21H
; The previous letter
MOV DL, X
ADD DL, 1
ADD DL, 48
MOV AH, 2h
INT 21H
; DOS exit
MOV AH, 4CH
INT 21H
MAIN ENDP
END MAIN
您可以执行以下操作
看:
为什么要添加DL,48?这只是整数到文本的转换所需要的,但你没有这样做。那我该怎么办?你把它们删除怎么样?其余的似乎没问题。哦,你也需要大写字母。。。然后将
add dl,1
更改为sub dl,31
,将sub dl,1
更改为sub dl,33
。请将解决方案作为答案发布。您应该将编辑到问题中的答案作为自己的答案发布到下面。
.MODEL SMALL
.STACK 100H
.DATA
MSG1 DB 0DH,0AH,'Enter a lowerCase letter between a and z :$'
MSG2 DB 0DH,0AH,'Tht previous letter is :$'
MSG3 DB 0DH,0AH,'The next letter is:$'
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
LEA DX,MSG1
MOV AH,9
INT 21H
MOV AH,1
INT 21H
LEA DX,MSG2
MOV AH,9
INT 21H
MOV AH,2
SUB AL,20H
SUB AL,1H
MOV BL,AL
MOV DL,BL
INT 21H
LEA DX,MSG3
MOV AH,9
INT 21H
MOV AH,2
ADD AL,2H
MOV DL,AL
INT 21H
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN