2016-04-29 4 views
0

Ich arbeite an einem MASM-Projekt und ich denke, ich habe alles runter/bereit zu gehen, erwarte, dass ich ein Zeiger Problem habe, glaube ich, und ich sehe es einfach nicht. Wenn ich es debugge, führt es zu einem Pufferüberlauf.MASM Pointers Implementierung

EDIT:

Einige weitere Informationen. Der Fehler scheint auf der ganzen Linie zu sein: Ich glaube, es hat etwas mit einer meiner Vergleichsanweisungen/Werten zu tun, die ich passiere, so dass es nicht bei der Rückkehr ankommt, wenn b/a und dann das Testen von a gleich 0 ist.

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

'hinzufügen esp, 12' <- warum Sie tun Haben Sie das, nachdem Sie eine "stdcall" -Funktion aufgerufen haben? – Michael

+0

Danke! War Rest von, als ich eine Cdecl-Druckfunktion darin hatte, einige vorherige Fehler zu debuggen; aber ich habe immer noch Probleme. –

+0

Bitte geben Sie weitere Informationen an. Wo ist der Pufferüberlauf? (Haben Sie versucht, den Code in einem Debugger zu durchlaufen, um den Überlauf zu erfassen?) –

Antwort

0

Sie ret 12 verwenden 12 Bytes aus dem Stapel zu entfernen, aber nur 12 Bytes auf dem Stack hinzufügen, wenn Sie vor der Zeile zu callingSection (unmittelbar verzweigen, die zu verderben scheint Stack, was teilweise wahr ist).

können Sie entweder entfernen Sie den Parameter aus dem ret Anweisung und stattdessen fügen add esp, 12call [email protected] folgende, oder Sie können eher getrennte Bereinigungsroutinen verwenden, als springe zu einer gemeinsamen finish:

+0

Ich glaube nicht, dass das der Fehler ist, da ich vorher das add esp, 12 in der Funktion hatte. Es ist ein Standard-Anruf, also sollte es ins Ziel springen: Teil für jeden Anruf und bereinigen den Stapel. Ich habe überprüft, um sicherzustellen, aber ich habe immer noch den Fehler. –