2014-12-06 2 views
0
compare PROTO, p1:DWORD, p2:DWORD 
.code 
compare proc p1:DWORD, p2:DWORD 
    mov eax, p1 
    mov edx, p2 
    mov eax, [eax] ;Getting an access violation here 
    mov edx, [edx] ; Would probably get one here too, why? 
    sub eax, edx 
    ret 
compare endp 
main PROC 
    LOCAL thesize:DWORD 
    mov thesize, 3 
    mov fill, 5 
    INVOKE compare, thesize, thesize 

    ret 
main ENDP 

이 코드가 작동하지 않는 이유는 궁금합니다. 그것을 작동시키는 또 다른 방법은 무엇입니까, 저는 레지스터를 가지고 놀면서 배열을 채울 때 비슷한 코드를 시도하고있었습니다 만,이 시점에서 고생했습니다.어셈블리의 레지스터 값에 액세스 할 때 액세스 기록 위반이 발생했습니다.

미리 감사드립니다.

+0

레지스터 값에 액세스하는 것이 아니라 잘못된 메모리 주소에 액세스하려고합니다. [eax]는 eds를 통한 메모리 액세스입니다 : eax 정도. 그리고 귀하의 케이스에 eax 레지스터가 메모리의 잘못된 페이지를 가리키는 데이터 세그먼트 내에 잘못된 오프셋을 포함하고 있습니다. – AlexanderVX

+0

@AlexanderVX 어떻게 메모리의 해당 위치에서 값을 수정합니까? 기본적으로, 나는 p1과 p2를 영구적으로 수정하고 싶지만 그 값을 변수로 직접 이동하지는 않습니다. – user2738003

+0

올바른 주소가있을 때만 일부 주소의 값을 수정할 수 있습니다. 코드의 의도가 명확하지 않습니다. Gunner의 대답은 당신이 원하는 것에 더 가깝지만 나는 단순한 오류만을 보았습니다. – AlexanderVX

답변

1

뭘하고 있는지 잘 모르겠지만 mem 주소를 역 참조하려는 것처럼 보이기 때문에 로컬 바를 사용하여 주소를 가져 오거나 전달하려면 addr을 사용해야합니다.

main PROC 
    LOCAL thesize:DWORD 
    mov thesize, 3 

; INVOKE compare, thesize, thesize 
; same as: 
; push 3 
; push 3 
; call compare 

    ; this is what you want: 
    invoke compare, addr thesize, addr thesize 
; same as: 
; lea  eax, thesize 
; push eax 
; push eax 
; call compare 
    ret 
main ENDP 
+0

그래,이게 많은 도움이되었다. 감사! – user2738003

관련 문제