2016-09-25 2 views
1

몇 가지 사항을 확인하고 싶습니다. 나는 8086을위한 어셈블리 언어 프로그램을 만들고있다. masm611 어셈블러를 사용하여 어셈블하고있다. 내가 실행하고 32 비트 윈도우에서 명령 프롬프트에서 8086 16 비트 리얼 모드 프로그램을 디버깅한다면, 실제 CPU 레지스터와 메모리를 사용하고 수정합니까? Windows 32 비트에서 프로그램이 가상 모드 86에서 실행됩니까? 나는 다음과 같이 PWB 마이크로 소프트 프로그래머 '워크 벤치에서의 CodeView 디버거를 사용하여 프로그램을 디버깅 할 경우16 비트 프로그램이 32 비트 OS에서 가상 8086 모드로 실행됩니까?

또한 :

PWB

8086 assembly language program with debugger running http://i65.tinypic.com/35cej2e.jpg

는 확인하시기 바랍니다 여부를 CodeView 디버거의 레지스터 및 메모리 값 하드웨어의 실제 값이며 변경됩니다. 또한 내가 PWB에서 프로그램을 실행하면 Windows 32 비트에서 실제 하드웨어를 사용합니다.

+0

참고로 코드가 실행되는 환경을보다 세부적으로 제어해야하는 경우 가상 컴퓨터 사용을 고려할 수 있습니다. –

답변

5

32 비트 버전의 Windows에서 Windows 명령 프롬프트에서 MS-DOS 프로그램을 실행하면 실제 모드를 에뮬레이트하기 위해 가상 8086 모드를 사용하는 NTVDM에서 실행됩니다. 이 프로그램은 실행 중일 때 CPU의 레지스터를 정상적으로 사용합니다. 그러나 리얼 모드에서 실행되는 코드와 동일한 방식으로 메모리를 사용하지는 않습니다.

Windows는 다른 Windows 응용 프로그램에 직접 액세스하지 않는 것처럼 NTVDM 및 그 아래에서 실행되는 프로그램에 실제 메모리에 대한 직접 액세스를 제공하지 않습니다. 대신 프로그램에서 메모리로의 액세스는 선형 주소에서 페이지 테이블을 통해 실제 주소로 변환됩니다. 즉, MS-DOS 응용 프로그램이 메모리 위치 074B : 0000에 쓰면 CPU가 선형 주소 000074B0로 변환 한 다음 페이지 테이블 조회를 통해 Windows에서 선택한 완전히 다른 실제 주소로 변환합니다. 또한 Windows는 NTVDM 또는 그 아래에서 실행되는 응용 프로그램이 장치 하드웨어에 액세스하는 것을 허용하지 않으므로 장치 메모리에 대한 모든 액세스가 NTVDM에 의해 차단되거나 에뮬레이션됩니다.

또한 사용중인 CodeView 버전도 디버깅중인 프로그램과 동일한 실제 CPU 레지스터를 사용하는 가상 8086 모드의 응용 프로그램으로 실행되는 MS-DOS 응용 프로그램이므로주의해야합니다. 이것은 CodeView가 디버깅 된 프로그램의 레지스터를 표시 할 때 프로그램이 중지되고 CodeView가 인수 한 시점의 값을 레지스터에 표시한다는 것을 의미합니다. CodeView는 자체적으로 레지스터를 필요로하기 때문에 제어권을 얻는 첫 번째 작업은 디버깅 된 프로그램 레지스터를 메모리에 저장하는 것입니다.

+0

디버거 작업 경험이 없습니다. 다음 내용을 확인하십시오. 1) 명령어는 실제로 코드 뷰에서 프로세서에 의해 실행됩니다. 2) 레지스터를 자체적으로 사용하고 있습니다. 따라서 디버거에 표시된 일부 레지스터의 값은 레지스터의 실제 값과 다릅니다. 3) mov AX, 0 실행 후, CV는 AX의 값을 메모리로 옮기고 AX 레지스터를 자신의 목적으로 사용할 수 있습니다. 4) 디버거에 표시된 메모리 내용은 실제 위치가 다르지만 실제 메모리에 있습니다. – user2277648

+0

@ user2277648 1) 예, 2) 표시된 시점에 다릅니다. 3) MOV 명령 CPU가 디버거로 들어갈 경우 (예 : 브레이크 포인트 또는 단일 스텝핑으로 인해) 디버거가 레지스터 내용을 메모리에 저장합니다. 4) 메모리 내용이 실제 RAM에있는 것 같습니다. 디버거가 내용을 읽고 표시 할 필요가 있었지만 Windows는 디스크의 스왑 파일에 내용을 저장하여 그 이후 RAM에 다른 것을위한 공간을 만들 수있었습니다.다시 액세스 할 때 Windows는 투명하게 메모리를 다시 복사 할 수 있습니다. –

+0

감사합니다. – user2277648

관련 문제