问题描述
我在理解此操作在汇编中的工作方式时遇到了一些麻烦。我有一个我编写并反汇编的程序。在其中,我访问字符串的单个字符并将其与测试字符串进行比较。我感到困惑的代码的重要部分在这里:
mov ecx,[ebp+string_offset]
add ecx,[ebp+counter_offset]
movsx edx,byte ptr [ecx]
我猜这是通过一些编译器优化生成的。代码的实际功能是有意义的。 ECX 被赋予一个地址,计数器被添加到它(以增加内存中的位置),然后 MOVSX
加载 ECX 指向的字节。
我感到困惑的是这里的括号。通常括号是解引用操作。因此,如果这是真的,ECX 将包含字符串的第一个 actual 元素。然后,我们将取消引用计数器,并将其添加到 ECX 以获取我们想要的元素,最后将该元素加载到 EDX 中进行比较。
这没有任何意义,因为如果取消引用字符串的地址会返回字符串本身,那么添加计数器只会产生无意义的结果。确实,在调试过程中,ECX 将包含字符串中字符的实际地址,然后 EDX 将包含字符本身。
这是括号的非标准使用还是我缺少的 c 字符串 (Char* xyz = "test"
) 作为数组的特殊用法?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)