2016-11-25 15 views
0

이 코드는 리얼 모드에서 작동합니다. 예 : 이 코드는 0x001FFD50 주소로 이동합니다. 내가 다시 0x001F0674 주소를 얻을 필요가REAL 모드의 어셈블러에서 32 비트 주소로 돌아 오는 방법은 무엇입니까?

: 그 후

... 
001F066F: push  es 
001F0670: push  0FD50 
001F0673: retf ^^^^^^ 
001F0674: push  00051 
... 

, 나는 같은 코드가 있습니다.

... 
001FFE91: push  00674 
001FFE94: retn ^^^ 
... 

대신에 나는 0x0674 주소로갑니다. 리얼 모드에서 0x001F0674 주소로 되돌리려면 어떻게해야합니까?

+3

세그먼트를 전환하려면 'retf'를 사용해야합니다. 첫 번째 예제를 사용하되'es '대신'push 0x001F'를 사용하십시오. 또는'es'가 여전히'0x001F'를 포함하고 있다면 그것을 유지할 수도 있습니다. – Jester

+3

두 번째보기에서는 동일한 세그먼트에있는 것처럼 보이므로 결국 세그먼트를 전환 할 필요가 없으므로 코드가 실제로 작동해야합니다. – Jester

+1

나는 어디에서나'0x001FFD50'와 같은 것을 가정합니다. 실제로는'0x001F : 0xFD50'을 의미합니다. 32 비트 주소가 아닌 경우 세그먼트 : offset (실제 주소 = 세그먼트 * 16 + 오프셋) –

답변

0

의견을 보내 주셔서 감사합니다.

세그먼트 및 오프셋에 대해 옳았습니다. 그러나 주소 0x001F0674가 파일에 있었고 메모리에서 덤프를 가져 왔을 때 그 세그먼트가 0x001F0674가 아닌 것을 보았습니다. 0x0018 * 16 + 0674였습니다.

감사합니다. @Jester, @Michael Petch, @ Ped7g.