2016-11-18 1 views
0

이러한 지침 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 바이트를 소비

(시계 등) 보충 :. 내 코드

  1. 후크 ivt 0x1ch (시스템 타이머 틱)을 내 함수 [foo]

  2. sti

  3. JMP $

  4. foo는 : 인쇄 'A'

내가 jmp $에서 스택을 확인하고 바로 전에 나는 그것이 6 바이트에 소비되는 것을 관찰 foo

+6

명령어의 동작은 명령어 세트 참조 문서 (Intel 문서를 기반으로 함)에 잘 설명되어 있습니다. http://www.felixcloutier.com/x86/ INT % 20n : INTO : INT % 203.html –

+2

해당 HTML은 Intel의 볼륨 2 PDF에서 발췌 한 것입니다. 당신이 올바른 매뉴얼을보고 있었지만, 나는 적당한 양으로 생각하지 않았습니다. –

+0

BTW,'call'은 정말로'push (eip + 2)'입니까? 제 말은,'eip'는 디코딩 단계 이후에 이미 다음 명령을 가리키고 있기 때문에, 내부 인터 위상 방식으로 해부하면'push eip'' jmp arg'가 맞습니다. 업데이트 된'eip'를 사용하고 싶지 않다면'push eip + '이고 명령 크기는 인수에 달렸고'call'은 2 (r32/[r32]), 5 (rel-imm32) 또는 7? 바이트 (즉각적인 변형). – Ped7g

답변

3

입력 나를 불러올 때 스택하기

이 줄과 "operating-system"태그에서 나는 실제 주소 모드에서 int 명령어를 사용했다고 결론을 내립니다. 이 경우 스택은 인터럽트 처리기의 시작 부분에 3 워드를 보유합니다.

밀어 첫번째 단어 (메모리 최고)에 FLAGS 레지스터이고, 제 2 단어는 푸시 CS 레지스터 및 푸시 3 워드 (낮은 메모리)에 IP 레지스터이다.

이제 INT 호출 후 스택을 수정하여 프로그램을 다른 곳으로 되돌리려합니다.

3 가지 단어 중 일부 또는 전부에 자유롭게 쓸 수 있습니다.

  • 다른 주소로 여전히 동일한 코드 세그먼트에 돌아가려면 , 당신은 작성합니다

    mov word ptr [esp], OtherLabel 
    iret 
    
  • 가 CarryFlag 세트로 돌아가려면 쓰기 :

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

CF :'또는 단어 ptr [esp + 4], 1' ... +6은 이미 실제 모드의 6 바이트 데이터를 넘었습니다. – Ped7g

+0

@ Ped7g 네 말이 맞아. 오타가 수정되었습니다. 감사. – Fifoernik

관련 문제