2011-09-30 4 views
2

함수의 시작 부분을 JMP 명령어로 바꾸어 함수에 연결하려고합니다. 하지만 문제는 내 함수의 주소를 대상으로 JMP 오프셋을 계산하는 방법을 모르겠다는 것입니다. 글쎄, 만약 당신이 메모리 (Destr addr - Current addr)에서 앞으로 뛰어 내리면 그것을하는 방법을 안다.하지만 나는 당신이 메모리에서 뛰어 내릴 때 그것을 결정하는 방법을 모른다.JMP 명령어 주소 계산하기

누군가 도움이 될까요?

답변

1

상대 점프가 서명됩니다. 즉, 부호 비트를 사용하여 양수 및 음수 변위가 지정됩니다. 절대 점프는 절대적이므로 절대 중요하지 않습니다. 양 지침서의 2A & 2B 양을보십시오.

3

이것은 알아낼 수 있어야하는 기본적인 수학입니다. :) JMP의 기대가 Destination - Origin 경우

은 다음 JMP 뒤로 Origin - Destination

일반 번호에 대해 생각 될 것이다 : 당신이 100에서 110으로 앞으로 JMP하려는 경우, JMP110 - 100 = 10 될 것이다. 같은 금액을 뒤로 JMP으로 지정하려면 100 - 110 = -10이됩니다.

+0

아니, 아니, 나는 앞으로 어떻게 뛰어날 지 압니다. 문제는 다음과 같이 계산하여 16 진수로 표현하는 방법을 잘 모르겠습니다. 예를 들어 주소 1000에서 2000으로 이동하려면 "E9 3E8"이되지만 2000에서 1000으로 점프하려면 어떻게해야합니까? "E9 FFFFFFFFFFFFFC18"같은 끔찍한 것이 있습니까? – user972948

+0

코드 –

+3

에서 계산을하십시오. 16 진수는 다릅니다. 내 예제를 '100'에서 '0x100', '110'에서 '0x110'으로 변경하면 수학은 동일합니다. –

5

역방향으로 점프하려면 음수 오프셋을 사용하십시오.

JMP 명령어의 크기를 기억해야합니다. 오프셋은 시작이 아니라 JMP 명령어의 끝을 기준으로합니다. 현재 주소가 JMP을 작성하려고하는 곳이면 JMP 명령어의 크기에 5 바이트의 오프셋을 더한 이후 5 + dest-current의 오프셋이 필요합니다.

이 함수 위의 위치에 더미 전화 걸기 몰래

-4

을 수

call location1 


.location1 
call location2 
.location2 
pop ax 
ret 
.yourfunction 

이제 도끼 3을 추가 도끼

에서 LOCATION2의 주소를 가지고 있고 메모리 주소를 당신의 기능 중