2017-12-20 39 views
3

현재 YouTube에서 x64 Assembly Tutorial을 통해 작업하고 있습니다.Visual Studio 2017의 디버거에서 레지스터에 대한 감시를 설정하려고합니다 : "레지스터 값 읽기 오류"

내가 지금하고있는 일은 C++ 기능을 ASSEMBLY에 사용하고 mov 명령을 사용하여 값을 레지스터로 옮기는 것과 같은 기본적인 것들이다.

다음
#include <iostream> 
using namespace std; 

extern "C" void SomeFunction(); 

int main() { 
    SomeFunction(); 

    // Just putting this here to stop the program from closing immediately after opening 
    cin.get(); 

    return 0; 
} 

ASSEMBLY 코드 : 여기

C++ 코드의

.code 
SomeFunction proc    
    mov ax, -1   
    ret         
SomeFunction endp 
end 

문제 : 나는 비주얼 스튜디오 커뮤니티 2017 사용하고, 내가 로컬 윈도우 디버거를 실행 언제 시계를 ax 레지스터에 추가하십시오. 그러나 오류 메시지 'Error reading register value'이 계속 나타납니다.

어디로 잘못 가고 있습니까?

사과하지 않을 경우 알려 주시면 더 잘 설명해 드리겠습니다.


UPDATE

: 그래서 내가 대신 rbx 레지스터를 사용하여 시도하고 난에 시계를 추가 할 수 있었다. 하지만 문제는 지금 내가 값 -1을 레지스터로 이동하기 위해 mov을 사용 했음에도 불구하고 값이 없다는 것을 나타냅니다 (값 섹션이 0으로 표시됨).

이 정보가 도움이되는지 알 수 없습니다.

+1

시계에 레지스터를 추가하는 것을 고려하지 않았지만 디버그 >> Windows >> 레지스터가 * 모든 * 레지스터를 볼 수있는 레지스터가 있습니다. –

+1

@BoPersson 레지스터 창은 항상 16 진수 값을 표시하는 것으로 보입니다.이 값은 조사 식 창에서 형식을 선택할 때 매우 편리합니다. – VTT

+1

어셈블리없이 일반 코드에서'ax' watch를 설정하려고한다면이 문제가 발생합니까? – VTT

답변

0

해결 : 문제를 해결하기 위해 먼저 각 명령에 중단 점을 추가했습니다. 이렇게하면 "단계별로"프로그램을 실행할 수 있습니다.

Debug >> Windows >> Registers :

다음 DEBUG 동안 나는 메뉴 선택을 위로하기 위해 갔다.

이렇게하면 모든 레지스터를 볼 수 있습니다.

그런 다음 모두 ASSEMBLYC++ 개의 파일을 저장 한 다음 실행합니다 (F5 키를 사용하여 실행할 수 있음).

참고 : 프로그램은 브레이크 포인트 이전의 모든 지시 사항을 수행합니다.

따라서 중단 점을 mov ax -1에 설정하면 모든 명령이 수행됩니다.

+2

** F11 ** 각 명령을 단계별로 실행 ... 모든 행에 중단 점을 설정할 필요가 없습니다 (많은 분기점을 설정하면 어느 분기가 많은 함수에서 어떤 실행 경로가 사용되는지 확인할 수 있음). 일반적으로 첫 번째 줄에 중단 점을 설정 한 다음 ** F10 ** 또는 ** F11 **을 사용하여 진행합니다. – Phil1970