汇编MASM将字符串中的char从小写更改为大写

时间:2013-12-09 10:22:44

标签: assembly masm

我在MASM中编写一个汇编代码,只转换已经声明为大写的字符串中的小写字母,只留下那些已经大写的字母。到目前为止,我有这个,但它以相反的顺序打印,我不知道为什么。此外,我试图删除计数器,因为我不应该有一个但没有它我的程序不运行。任何建议都会有所帮助!

      .386
      .MODEL FLAT
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
Include io.h                                          
cr            equ    0DH                           
Lf            equ    0AH                           
             .stack  4096
             .data
str1         dword  "aBcD",0
str1value  byte  "The new value of str1 is: ", 0 
           byte cr, Lf, 0
          .code
_start:
          sub esi, esi                            ; index reg
          lea ebx, str1
top:      mov al, [ebx+esi]
          and al, 0DFh                   ;convert lowercase to  corresponding uppercase
          mov [esi+ebx], al
          inc esi
          loop top
done:     output str1value
          output str1

          Invoke ExitProcess, 0
Public _start                                     ; make entry point public
          end                                     ; end of source code

2 个答案:

答案 0 :(得分:0)

这是因为你已经将你的字符串声明为dword以及汇编程序如何解释dword字符串常量。您应该使用byte代替,即

str1         byte  "aBcD",0

此外,如果您使用loop指令,则应将cx初始化为要执行的最大迭代次数。要摆脱您的计数器(esi),您可以使用ecx-1作为ebx的偏移来向后处理字符串。

答案 1 :(得分:0)

反转字符串的原因是字符串前面的dword应为byte

要摆脱循环计数器,您只需扫描字符串中的0字节即表示字符串的结尾。

mov esi, offset str1

@@ProcessChar:
    mov   al, [esi]
    test  al, al
    je  @@Done

    ...
    inc esi
    jmp @@ProcessChar

@@Done:
   ...

如果您使用的是循环计数器方法,则必须初始化ecx,但代码中缺少这种方法。