2016-04-29 99 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。这是一个标准的呼叫,所以它应该跳到结束:每个呼叫的一部分,并清理堆栈。我核实确认,但我仍然有错误。 –