字符串小写到大写表示复制最后一个字母,而不是大写字符串 [英] String lowercase to uppercase is duplicating the last letter instead of uppercasing the string

查看:0
本文介绍了字符串小写到大写表示复制最后一个字母,而不是大写字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个程序,将多个小写字母转换为其等效的大写字母。

例如,我想要的输出是:

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 $"  

推荐答案

我知道我的代码不正确,但我不知道哪里出错了

  1. 输入循环应将字符存储在某个位置
MOV CX, 5
MOV AH, 1                   
@LOOP:
INT 21H
                <<<<
LOOP @LOOP
  1. 第一个输出循环应检索并使用未经修改的存储的字符
MOV CX, 5
MOV DL, BL
MOV AH, 02H
@LOOP2:
INT 21h         <<<<

LOOP @LOOP2
  1. 第二个输出循环应检索存储的字符并将其大写
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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆