Такие, как 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 байт при запуске с помощью аппаратных средств (например, часы)
дополнение:. Мой код
крючок IVT 0x1ch (System Timer Tick) к моей функции [Foo]
STI
JMP $
Foo: печать 'A'
проверить стек на
jmp $
и непосредственно перед входомfoo
Поведение инструкции хорошо документировано в ссылках на набор инструкций (на основе документов Intel): http://www.felixcloutier.com/x86/ INT% 20n: INTO: INT% 203.html –
Этот HTML является выпиской из тома 2 тома 2 Intel. Вы искали правильные руководства, но я думаю, что не в правильном объеме. –
BTW, 'call' really' push (eip + 2) '? Я имею в виду, что 'eip' уже указывает на следующую инструкцию после фазы декодирования, поэтому, если вы проанализируете ее во внутреннем межфазном режиме, тогда' push eip' 'jmp arg' верен. Если вы не хотите использовать обновленный 'eip', то это' push eip + 'и размер команды зависит от аргумента,' call' может иметь 2 (r32/[r32]), 5 (rel-imm32) или 7? байты (очень немедленный вариант). –
Ped7g