2017-10-21 2 views
0

Ich verwendete vs 2015, um x64-Masm-Programm zu schreiben.Fehler "Access violation reading location"

ExitProcess PROTO 
MessageBoxA PROTO 
.data 
    text db "Winter hat", 0Ah, "Upon my head - ", 0Ah, "My head stays warm,", 0Ah, "But my nose is red!;", 0 
    header db "Task1", 0 

.code 

main proc 

xor rcx, rcx 
mov r9b, 0 
lea rdx, text 
lea r8, header 

call MessageBoxA 

call ExitProcess 

main endp 

end 

Von Zeit zu Zeit i nächste Fehler:

Exception thrown at 0x00007FF9C65261BE (gdi32.dll) in ConsoleApplication1.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

If there is a handler for this exception, the program may be safely continued.

Könnten Sie klären, wo Fehler in meinem Code sein kann?

Antwort

0

Dieser Fehler kann auftreten, wenn Sie die Prozeduren ohne Parameter aufrufen, Es ist besser, sie mit INVOKE anstelle von CALL aufzurufen, um die richtige Fehlermeldung zu erhalten. Auch ich denke, MessageBoxA müssen Parameter auf dem Stapel nicht in den Registern, so dass Sie params so sagen kann:

.data 
text db "your message box text", 0 
header db "message box caption",0 

.code 
start: 
push MB_OK 
push addr header 
push addr text 
push 0 
call MessageBox 

ODER

invoke MessageBox, 0, addr text, addr header, MB_OK