有一个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
答案 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
现在可以提高效率,因为你有很多重复的代码。但就是已经完成所有工作才能使其正常运行。