【问题标题】:Can you help me to explain this asm code? [closed]你能帮我解释一下这个asm代码吗? [关闭]
【发布时间】:2014-11-29 03:31:31
【问题描述】:

我有一段小代码,我不明白它的含义。谁能帮我解释一下?

mov     ecx, [esp+8]
mov     edx, [ecx]
inc     edx
mov     [ecx], edx
dec     edx
mov     al, [esp+4]
mov     [edx], al
mov     eax, [esp+4]
and     eax, 0FFh
retn

【问题讨论】:

  • 你有什么不明白的?
  • 为什么会有人支持这个?

标签: assembly x86


【解决方案1】:

(我的组装有点生疏,如有错误请大家指正):

  1. esp 是当前的堆栈指针,通常是本地和参数所在的位置。 esp+8 将访问距当前堆栈帧地址偏移 8 个字节的项目。 [x] 表示取消引用,因此本地是指针类型。
  2. 这个值被复制到ecx通用寄存器中。
  3. ecx 的值随后被解释为一个指针并被取消引用到 edx,表明它是一个指针到指针的类型。
  4. edx 的值递增(可能指向具有 1 字节大小元素的数组中的下一个元素)。
  5. edx 的值被复制回ecx 指向的地址。
  6. 然后edx 递减。
  7. 偏移量 4 处的堆栈值被复制到 a 寄存器的低 8 位(这是 eaxax 寄存器的不同视图)。
  8. 然后将该值复制到edx 指向的任何位置。
  9. 重复使用第 7 步中的相同值并与 0xFF 进行与运算 - 这实际上与复制到 al 相同(因为两者都只处理值的低 8 位)。
  10. 最终retn 从堆栈中获取返回地址并从该地址继续执行。

在 C 中,我认为这是一个近似值:

...
char* a = ... // local at offset +4
char** b = ... // local at offset +8
char* c = *b;
c++;
(*c)--;
*c = a; // lower 8-bits implicit if `sizeof(char) == 1` and 1 byte is 8 bits (non-octet systems do exist)
char* d = a & 0xFF;
return;

我不完全确定这里发生了什么,因为您似乎缺少发布之前的说明。

【讨论】:

  • 你就像一本行走手册。将其自动化到像那些正则表达式解释器这样的网站会很有趣。
  • 非常感谢。很抱歉,因为在发布之前缺少说明。我不会再这样做了。
  • @simonzack 我喜欢这个主意!想一起努力吗? :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 2021-12-22
  • 1970-01-01
  • 2017-04-08
  • 2022-11-24
  • 1970-01-01
相关资源
最近更新 更多