2015-12-30 72 views
2

快速关于该问题的答案:Purpose of ESI & EDI registers?为什么会发生这种C代码产生这种大会

srcp [srcidx++] = argv [j]; C code translates too 

8B550C   mov edx,[ebp+0C] 
8B0C9A   mov ecx,[edx+4*ebx] 
894CBDAC  mov [ebp+4*edi-54],ecx 
47    inc edi 

我已经采取了组装类和知道的基本知识,而不是寻找什么mov手段,但我m主要是作为+0C+4*ebxebp+4*edi-54陈述的用途而混淆。他在帖子中解释,但我仍然不理解。

ebp+12argv,但为什么它增加了12?

ebxj,但为什么这个乘以4并加到ebp

他说:“第三个指令使用edi乘以4,并增加了ebp通过0x54(的srcp位置)偏移”;为什么它必须乘以4? 另外他说加了偏移量;为什么它在代码中是-54而不是+54

只是有点困惑。

+0

我认为乘以4是因为argv的类型是4字节的一个(例如int)。 – seleciii44

+0

正是你的问题解释[这里](http://stackoverflow.com/a/1858322/1632887) – seleciii44

回答

5

我认为,我们有以下几点:

  • srcidx生活edi寄存器
  • argv在偏移0xC的从帧的开始(因此[ebp+0C]
  • j的确是ebx - 中我们有4次的原因是我们正在处理4个字节的整数数组,所以偏移量必须乘以元素(4)的大小才能得到正确的地址。
  • srcp是位于偏移-54相对于框架(ebp

我希望回答你的问题的开始堆栈变量。这可能有助于将代码加载到调试器中,并通过逐步执行一条指令来运行代码,并在每个步骤中将寄存器和内存部分转储并将其与变量的状态进行比较。

+0

是的,这有助于很多谢谢,是否有一个原因,它是基地的开始-54?我知道堆栈中的变量是使用偏移来引用的。所以当括号在整个方程的周围时,它是否将ebx中的J的值乘以4,然后将它添加到edx以存储在ecx中? – JimmySmithJR

+0

-54来自栈的布局。这正是阵列碰巧是由于代码的性质所致。括号表示'取消引用地址',你可以认为它们与C中指针的*运算符类似,'mov'参数是目的地然后是源地址,所以'mov [ebp + 4 * EDI-54],ecx' –

相关问题