你能帮我解释一下这个asm代码吗?

时间:2014-11-29 03:31:32

标签: assembly x86

我有一段小代码,我无法理解它的含义。谁能帮我解释一下呢?

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

1 个答案:

答案 0 :(得分:0)

(我的集会有点生疏,如果我错了,请任何人纠正我):

  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进行AND运算 - 这与复制到al实际上是相同的(因为两者都只处理值的低8位)。
  10. 最后retn从堆栈中获取返回地址,然后从该地址继续执行。
  11. 在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;
    

    我不完全确定这里发生了什么,因为看起来你错过了发布之前的说明。