0

有一个 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
4

1 回答 1

2

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

首先,小写测试(测试01100000b)不起作用。无论哪种情况,它都不会为零,因为它们都设置了第 6 位。

如果认为确保仅将“a”大写为“z”的唯一方法是显式比较该范围内的字符。所以你的第一个测试变成了这样:

    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

现在这可以变得更有效率,因为你也有很多重复的代码。但这就是让它发挥作用要做的一切。

于 2013-05-12T01:04:51.070 回答