Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编MASM将字符串中的字符从小写更改为大写_Assembly_Masm - Fatal编程技术网

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

Assembly 汇编MASM将字符串中的字符从小写更改为大写,assembly,masm,Assembly,Masm,我正在用MASM编写一个汇编代码,以便只将已声明为大写的字符串中的小写字母转换为大写字母,而将已声明为大写的字母单独转换为大写字母。到目前为止,我有这个,但它是按相反的顺序打印的,我不知道为什么。此外,我试图删除计数器,因为我不应该有一个,但没有它我的程序无法运行。任何建议都会有帮助 .386 .MODEL FLAT ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD Include io.h

我正在用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

这是因为您已将字符串声明为
dword
以及汇编器如何解释
dword
字符串常量。您应该使用
字节
,即

str1         byte  "aBcD",0


此外,如果使用
循环
指令,则应将
cx
初始化为要执行的最大迭代次数。为了摆脱计数器(
esi
),您可以使用
ecx-1
作为
ebx

的偏移量来向后处理字符串。反转字符串的原因是字符串前面的
dword
,它应该是
byte

要去掉循环计数器,您只需扫描字符串以查找表示字符串结尾的0字节

mov esi, offset str1

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

    ...
    inc esi
    jmp @@ProcessChar

@@Done:
   ...
如果使用循环计数器方法,则必须初始化
ecx
,这在代码中是缺失的