2016-04-29 56 views
0

我正在開發一個MASM項目,我想我已經把所有東西都放下了/準備好了,期待我有一個指針問題,我相信我只是沒有看到它。當我調試它時,會導致緩衝區溢出。MASM指針實現

編輯:

一些更多的信息。這個錯誤似乎是在這條線上:我相信它與我的一個比較語句/值有關,因此它在b/a然後對它進行測試a時等於0時不會捕獲返回值。

mov  eax, DWORD PTR[EBP + nBOffset] 

CODE:

.model flat 
.686 
.STACK 4096 

pDepthOffset EQU 8 
nAOffset  EQU 12 
nBOffset  EQU 16 

.data 

nTempSwap dd ? 
.code 

[email protected] PROC PUBLIC 
    push ebp 
    mov  ebp, esp 
    push ebx 

    ;ndepth += 1 section. 
    mov  eax, DWORD PTR[EBP + pDepthOffset] 
    add  eax, 1 
    mov  DWORD PTR[EBP + pDepthOffset], EAX 
    mov  eax, DWORD PTR[EBP + nAOffset] 

    ;if b < a 
    cmp  eax, DWORD PTR[EBP + nBOffset] 
    jae  returnsection 

;SWAP section 
    mov  ecx, DWORD PTR[EBP + nAOffset]      ; saving off A value. 
    mov  eax, DWORD PTR[EBP + nBOffset]      ; saving off B value 
    mov  DWORD PTR[EBP + nAOffset], eax      ; storinng my B into A 
    mov  DWORD PTR[EBP + nBOffset], ecx      ; storinng my A into B 


;checking if equal to 0 
returnsection: 
    cmp  DWORD PTR[EBP + nAOffset], 0 
    jne  callingSection 
    mov  eax, DWORD PTR[EBP + nBOffset] 
    jmp  finish 

callingSection: 
    mov  eax, DWORD PTR[EBP + nAOffset] 
    push eax 
    mov  ecx, DWORD PTR[EBP + nBOffset] 
    sub  ecx, DWORD PTR[EBP + nAOffset] 
    push ecx 
    mov  edx, DWORD PTR[EBP + pDepthOffset] 
    push edx 
    call [email protected] 

finish: 
    pop  ebx 
    pop  ebp 
    ret  12 
[email protected] ENDP 
END 
+0

'ADD ESP,12' < - 爲什麼你在調用看起來是一個'stdcall'函數之後有這個嗎? – Michael

+0

謝謝!當我在那裏嘗試調試一些以前的錯誤時,有一個cdecl打印功能時就剩下了;但我仍然有問題。 –

+0

請提供更多信息。緩衝區溢出在哪裏? (你是否試過在調試器中單步執行代碼以捕獲行爲中的溢出?) –

回答

0

您正在使用ret 12從堆棧中刪除12個字節,但只增加了12個堆棧,如果你跳轉到callingSection(立即似乎破壞前行這是部分正確的)。

您可以從您的ret指令刪除參數,而是添加add esp, 12以下call [email protected],或者可以使用單獨的清理程序,而不是跳轉到一個共同的finish:

+0

我不認爲這是錯誤,因爲我以前曾在函數中添加esp,12。這是一個標準的呼叫,所以它應該跳到結束:每個呼叫的一部分,並清理堆棧。我覈實確認,但我仍然有錯誤。 –