2016-11-25 13 views
0

Этот код работает в реальном режиме. У меня есть такой пример: Этот код обращается к адресу 0x001FFD50.Как вернуться в ассемблере в режиме REAL до 32-разрядного адреса?

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

После этого, у меня есть такой код:

Мне нужно, чтобы вернуться к адресу 0x001F0674.

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

Но вместо этого я перехожу к адресу 0x0674. Как я могу вернуться к адресу 0x001F0674 в реальном режиме?

+3

Для переключения сегментов вам необходимо использовать 'retf'. Просто используйте свой первый пример, но 'push 0x001F' вместо' es', очевидно. Или, если 'es' все еще содержит' 0x001F', вы можете даже сохранить это. – Jester

+3

Во втором случае вы, кажется, находитесь в одном и том же сегменте, поэтому ваш код должен работать, так как вам не нужно переключаться между сегментами. – Jester

+1

Я предполагаю, что везде у вас есть что-то вроде '0x001FFD50', вы действительно имеете в виду' 0x001F: 0xFD50' Я спрашиваю, потому что если это так, это не 32-разрядные адреса, это сегмент: смещение (физический адрес = сегмент * 16 + смещение) –

ответ

0

Спасибо за ваши предложения!

Вы были правы в отношении сегмента и смещения. Но адрес 0x001F0674 был в файле, и когда я взял дамп из памяти, я увидел, что этот сегмент отличается от 0x001F0674. Это было 0x0018 * 16 + 0674.

Большое спасибо @Jester, @Michael Petch, @ Ped7g.

 Смежные вопросы

  • Нет связанных вопросов^_^