이러한 지침 86 같이INT 명령어의 정확한 동작은 무엇입니까?
push:
sub esp, data_size
mov [esp], data
그리고 call
에 의해 설명 될 수 있습니다 : push
이 정확하게에 의해 설명 될 수이를 알면
call:
push (eip+2)
jmp addr
, 우리는 약 완전히 명확 것 이 명령어들이 스택, 레지스터 및 플래그에 어떻게 영향을 미치는지 그리고 나는 그것이 중요하다고 생각합니다.
그러나 "인텔 ® 64 및 IA-32 아키텍처 소프트웨어 개발자 설명서"를 검토 한 후. 및 "i386 프로그래머 매뉴얼"INT 명령어의 정확한 동작에 대해 전혀 알지 못했습니다.
이제 INT 호출 후 스택을 수정하여 프로그램을 다른 곳으로 되돌리려합니다.
그럼 정확히 INT가 호출 된 후 무엇을 했습니까?
사전에
감사 (프로그래머 또는 하드웨어에 의해. 나는 그들이 다르게 행동들은)!
추신 : 내가 아는 한, INT는 EIP를 밀어
, 4 범용 레지스터, EFLAGS 어떤 순서로 이상한 일. 하드웨어에 의해 트리거 될 때
내가 나를 호출 할 때 스택에 6 바이트를 소비하는 것을 관찰,
는 그것은 18 바이트를 소비
(시계 등) 보충 :. 내 코드
후크 ivt 0x1ch (시스템 타이머 틱)을 내 함수 [foo]
sti
JMP $
foo는 : 인쇄 'A'
내가
jmp $
에서 스택을 확인하고 바로 전에 나는 그것이 6 바이트에 소비되는 것을 관찰foo
명령어의 동작은 명령어 세트 참조 문서 (Intel 문서를 기반으로 함)에 잘 설명되어 있습니다. http://www.felixcloutier.com/x86/ INT % 20n : INTO : INT % 203.html –
해당 HTML은 Intel의 볼륨 2 PDF에서 발췌 한 것입니다. 당신이 올바른 매뉴얼을보고 있었지만, 나는 적당한 양으로 생각하지 않았습니다. –
BTW,'call'은 정말로'push (eip + 2)'입니까? 제 말은,'eip'는 디코딩 단계 이후에 이미 다음 명령을 가리키고 있기 때문에, 내부 인터 위상 방식으로 해부하면'push eip'' jmp arg'가 맞습니다. 업데이트 된'eip'를 사용하고 싶지 않다면'push eip +'이고 명령 크기는 인수에 달렸고'call'은 2 (r32/[r32]), 5 (rel-imm32) 또는 7? 바이트 (즉각적인 변형). –
Ped7g