2015-12-30 71 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' –

相關問題