2015-04-17 23 views
1

學習如何遍歷命令行參數,我想是這樣如何在不破壞它的情況下輸出ecx寄存器?

ARG [0]輸出:CMDL
ARG [1]:d:/test.src
ARG [2]:FOO

在循環中,我推送eax,epb和ecx,然後輸出arg值。然後彈出3個寄存器,遞增ECX,清理堆棧等

我有一個可變的.bss中保留:

c: resd 1 

這是我的循環結構:

.do: 
    push ebp 
    push eax 
    push ecx 

    mov  [c], ecx 

    push DWORD [ebx] 
    push DWORD [c] 
    push marg 
    call _printf 
    add  esp, 8  ; clean up stack 

    pop  ecx 
    pop  eax 
    pop  ebp 

    add  ebx, 4  ; move to next arg 
    inc  ecx    ; increment counter 

    cmp  ecx, eax 
    jne  .do 

在.data段,瑪格被定義爲這樣:

marg:  db "arg[%d]: %s", 10, 0 

這是我的電流輸出和該應用管芯:

ARG [0]:CMDL
ARG [7020225]:d:/test.src
ARG [7019969]:FOO
ARG [7019929]:(空)

回答

4

您「再沒有適當平衡堆棧:

push DWORD [ebx] 
push DWORD [c] 
push marg 
... 
add  esp, 8  <-- This is wrong 

你推3個DWORD s,這是12個字節,但你只正在‘啪’的8個字節。

所以發生了什麼事情是,當你做pop ecx時,你放在堆棧上的字符串指針push DWORD [ebx]結尾在ecx。所以現在ecx被搞砸了,這就是爲什麼你在打印輸出中得到那些大的參數號,以及爲什麼循環不會終止。

相關問題