字符串小写到大写表示复制最后一个字母,而不是大写字符串 [英] String lowercase to uppercase is duplicating the last letter instead of uppercasing the string
本文介绍了字符串小写到大写表示复制最后一个字母,而不是大写字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在编写一个程序,将多个小写字母转换为其等效的大写字母。
例如,我想要的输出是:
Input a letter: asddf
The uppercase equivalent of letter asddf is ASDDF
但它只获取并打印最后一个字符,如下所示:
Input a letter: asddf
The uppercase equivalent of letter fffff is FFFFF
如何修复此问题?我知道我的代码不正确,但我不知道哪里出了错,因为我对这门语言仍然是新手。谢谢!
以下是我的代码:
org 100h
LEA DX, lowercase
MOV AH, 9
INT 21H
MOV CX, 5
MOV AH, 1
@LOOP:
INT 21H
LOOP @LOOP
MOV BL, AL
LEA DX, uppercase
MOV AH, 9
INT 21H
MOV DL, BH
MOV AH, 02H
INT 21h
MOV CX, 5
MOV DL, BL
MOV AH, 02H
@LOOP2:
INT 21h
LOOP @LOOP2
LEA DX, uppercase_
MOV AH, 9
INT 21H
SUB BL, 20H
MOV CX, 5
MOV AH, 2
MOV DL, BL
@LOOP3:
INT 21H
LOOP @LOOP3
MOV AH, 4CH
INT 21H
ret
lowercase db "Input a letter: $"
uppercase db 0AH, 0DH, "The uppercase equivalent of letter$"
uppercase_ db " is $"
推荐答案
我知道我的代码不正确,但我不知道哪里出错了
- 输入循环应将字符存储在某个位置
MOV CX, 5 MOV AH, 1 @LOOP: INT 21H <<<< LOOP @LOOP
- 第一个输出循环应检索并使用未经修改的存储的字符
MOV CX, 5 MOV DL, BL MOV AH, 02H @LOOP2: INT 21h <<<< LOOP @LOOP2
- 第二个输出循环应检索存储的字符并将其大写
MOV CX, 5 MOV DL, BL MOV AH, 02H @LOOP3: INT 21h <<<< LOOP @LOOP3
常规解决方案
在代码中添加一行内容为buffer db 5 dup(0)
。然后更改所有循环,如下所示:
- 这是存储以下内容的循环:
xor bx, bx
@LOOP:
...
mov [buffer + bx], al ; Store lowercase
inc bx
cmp bx, 5
jb @LOOP
- 这是一个检索
xor bx, bx
@LOOP:
mov dl, [buffer + bx] ; Retrieve lowercase
...
inc bx
cmp bx, 5
jb @LOOP
特殊解决方案
由于您已经将字符数硬编码为5,因此可以使用我在my previous answer中向您展示的相同技术。它将允许您一次打印所有内容:uppercase db 0AH, 0DH, "The uppercase equivalent of letter$"
uppercase_ db "????? is ?????$"
; ^ ^
; | 9 characters apart
...
xor bx, bx
@LOOP:
mov ah, 01h ; DOS.GetCharacter
int 21h ; -> AL
mov [uppercase_ + bx], al ; Store lowercase
sub al, 32
mov [uppercase_ + bx + 9], al ; Store uppercase
inc bx
cmp bx, 5
jb @LOOP
... Print with DOS.PrintString 09h
这篇关于字符串小写到大写表示复制最后一个字母,而不是大写字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文