2016-11-18 3 views
0

Такие, как x86 инструкции: push может быть точно описывается:Каково точное поведение инструкции INT?

push: 
sub esp, data_size 
mov [esp], data 

И call может быть описана:

call: 
push (eip+2) 
jmp addr 

Зная это, мы были бы совершенно четко как эти инструкции влияют на стек, регистры и флаги, и я думаю, что это имеет решающее значение.

Однако, пройдя «Руководство разработчика программного обеспечения Intel® 64 и IA-32». и «Руководство программистов i386». Я ничего не нашел о точном поведении инструкции INT.

Теперь я хочу изменить стек после вызова INT, чтобы моя программа вернулась в другое место.

Итак, что именно сделал INT после его вызова?

(программистом, или аппаратного обеспечения. Я слышал, что они действуют по-разному)

Спасибо заранее !!

пс:

Насколько я знаю, INT толкает EIP, 4 общие регистры, EFLAGS и некоторые странные вещи в определенном порядке.

я заметил, что она израсходовала 6 байт на стек при вызове мне,

и потребляется 18 байт при запуске с помощью аппаратных средств (например, часы)

дополнение:. Мой код

  1. крючок IVT 0x1ch (System Timer Tick) к моей функции [Foo]

  2. STI

  3. JMP $

  4. Foo: печать 'A'

проверить стек на jmp $ и непосредственно перед входом foo

+6

Поведение инструкции хорошо документировано в ссылках на набор инструкций (на основе документов Intel): http://www.felixcloutier.com/x86/ INT% 20n: INTO: INT% 203.html –

+2

Этот HTML является выпиской из тома 2 тома 2 Intel. Вы искали правильные руководства, но я думаю, что не в правильном объеме. –

+0

BTW, 'call' really' push (eip + 2) '? Я имею в виду, что 'eip' уже указывает на следующую инструкцию после фазы декодирования, поэтому, если вы проанализируете ее во внутреннем межфазном режиме, тогда' push eip' 'jmp arg' верен. Если вы не хотите использовать обновленный 'eip', то это' push eip + 'и размер команды зависит от аргумента,' call' может иметь 2 (r32/[r32]), 5 (rel-imm32) или 7? байты (очень немедленный вариант). – Ped7g

ответ

3

Я заметил, что она израсходовала 6 байт на стек при вызове мной

Из этой строки и из тега «Операционная система» я пришел к выводу, что вы использовали команду int из режима реального адреса. В этом случае стек будет содержать 3 слова в начале обработчика прерываний.

1-слово нажатое (самый высокий в памяти) является FLAGS регистром, то второе слова толкнул является CS регистром, а третье слово нажатого (самым низким в памяти) является IP регистром.

Теперь я хочу изменить стек после вызова INT, чтобы моя программа вернулась в другое место.

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

  • Для возврата к другому адресу, но все в том же сегменте кода, можно было бы написать:

    mov word ptr [esp], OtherLabel 
    iret 
    
  • Чтобы вернуться с набором флаг переноса, вы пишете:

    or word ptr [esp+4], 1 
    iret 
    
+0

CF: 'или слово ptr [esp + 4], 1' ... +6 уже выходит за пределы реального режима 6 байтов данных. – Ped7g

+0

@ Ped7g Вы правы. Я исправил опечатку. Благодарю. – Fifoernik

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