2013-12-09 42 views
0

我正在MASM中编写一个汇编代码,只将已经声明为大写的字符串中的小写字母转换为仅大写字母。到目前为止我有这个,但它以相反的顺序打印,我不知道为什么。另外,我正试图删除柜台,因为我不应该有一个,但没有它我的程序无法运行。任何的意见都将会有帮助!组装MASM将字符串中的char从小写更改为大写

 .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 

回答

0

这是因为你已经宣布你的字符串作为dword和汇编器是如何解释dword字符串常量。您应该使用byte代替,即

str1   byte "aBcD",0 

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

0

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

要摆脱循环计数器,您可以简单地扫描字符串的0字节,它表示字符串的结尾。

mov esi, offset str1 

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

    ... 
    inc esi 
    jmp @@ProcessChar 

@@Done: 
    ... 

如果您正在使用循环计数器方法,则必须初始化ecx,尽管如此,代码中缺少该方法。

相关问题