将小写字符串转换为大写masm

时间:2013-05-12 00:37:48

标签: x86 inline-assembly masm

有一个printf语句告诉编译器打印outStr。 outStr最初设置为等于emptybuf [1000] =“???尚未翻译???”;我应该将我的答案移到outStr中,它应该更新print语句中的outStr。

由于某些原因,我的内联汇编不会打印出下面显示的代码中的任何内容。我无法理解我做错了什么。我试图将小写字母转换为大写,并忽略任何特殊字符。任何建议都非常感谢。

mov esi,inStr ;To start off initialize  esi point to input string
mov edi,outStr  ;edi point to the output string area

    ; using esi and edi with [esi] and [edi] as indirect operand

    ; suggestion  to start mov each character to al  like   -->  mov al,[esi]
    ; test, and manipulate character in al


        jmp getNext         
getNext: mov al,[esi]
    cmp al,0
 je exitProc
        test al,01100000b ;test to see if its a lowercase letter
        je toUpperCase
        test al,01000000b
        mov [edi],al
        inc esi
toUpperCase: test al,01000000
         AND al,11011111b
         mov [edi],al
         inc esi
         jmp getNext
exitProc: mov outStr, edi

1 个答案:

答案 0 :(得分:2)

这里有很多错误,所以我会尝试分别解释每个部分。

首先,小写测试(测试01100000b)不起作用。对于任何一种情况,它都永远不会为零,因为它们都设置了第6位。

如果认为唯一的方法是确保你只是将'a'大写''到'''来明确比较该范围内的字符。所以你的第一次测试就是这样的:

    cmp al,'a'
    jl noChange
    cmp al,'z'
    jle toUpperCase
noChange:
    mov [edi],al
    ...

然后test al,01000000b之前的其他mov [edi],al不执行任何操作,因此可以删除。

一旦你在已经大写的分支中复制了字符,你就应该跳到循环的顶部,否则你将进入toUpperCase分支并存储角色第二次。

另外你应该增加edi,否则你会一遍又一遍地写到同一个位置。

    mov [edi],al
    inc edi     ; You need to add this
    inc esi
    jmp getNext ; You need to add this

同样适用于toUpperCase分支。你需要增加edi,然后你再次进行一项无效的测试。

toUpperCase:
     AND al,11011111b
     mov [edi],al
     inc edi   ; Add this
     inc esi
     jmp getNext

最后,退出时,需要在outStr的末尾添加一个NULL。并且不需要将edi分配回outStr,特别是因为它现在指向字符串的末尾。

exitProc:
     mov [edi],0

现在可以提高效率,因为你有很多重复的代码。但就是已经完成所有工作才能使其正常运行。