2017-01-01 2 views
3

필자가 작성한 8086 어셈블러에 문제가 있습니다. 문제는 어셈블러 통과에 있습니다.어셈블러에서 문제가 발생합니다.

패스 1 동안 각 라벨의 세그먼트와 관련된 위치를 계산합니다.

이제 각 명령어의 크기를 계산하여 오프셋에 추가해야합니다.

레이블의 위치가 범위 내에 있으면 8086의 일부 지침이 더 작아야합니다. 예를 들어 "jmp _label"은 가능한 경우 짧은 점프를 선택하고 그렇지 않으면 점프 할 수 없습니다.

이제 문제는 1 번 레이블에 도달하지 않았기 때문에 "jmp short _label"이 "jmp near _label"명령보다 작기 때문에 명령어의 크기를 결정할 수 없습니다.

날씨를 "jmp _label"이 "jmp short _label"이되도록 어떻게 결정할 수 있습니까?

현재 명령 앞에 오프셋을 지정하기 전에 모든 명령의 크기를 알아야하기 때문에 세 번의 통과가 문제가 될 수도 있습니다.

감사

+0

나는 가능한 해결책을 생각해 봤으면 동의 하는가? – NibbleBits

+0

당신이 동의하면 가능한 해결책을 알았습니까? 내가 할 수있는 일은 추측을하고 짧은 점프를 선택하는 것입니다. 세그먼트에 대한 크기를 계산 한 후에는 추적을 수행하여 각 명령 오프셋을 수정하면 실수인지 여부를 확인합니다. 이 방법은 느리지 만 더 좋은 방법이 있으면 알려주세요. – NibbleBits

+0

8086 용 어셈블러를 작성하고 있습니다. 거기에서 어셈블러로 생성하는 컴파일러를 작성 했으므로 어셈블러에서 컴퓨터 코드가 생성됩니다. – NibbleBits

답변

3

당신이 할 수있는 것은 짧은 점프 충분한 될 것입니다 있다는 가정에서 시작한다. 점프 거리를 알았을 때 (또는 바뀔 때) 가정이 무효가되면, 점프 거리를 가까운 점프로 늘립니다. 이 확장 후에는 확장 점프 다음에 레이블의 오프셋을 조정해야합니다 (근거리 점프 명령의 길이에서 짧은 점프 명령의 길이 빼기). 이 조정으로 인해 다른 짧은 점프가 불충분해질 수 있으며 점프까지도 변경해야합니다. 따라서 실제로 여러 번의 반복이있을 수 있습니다.

이것을 구현할 때 점프 명령어를 확장 할 때 메모리에서 코드를 이동하지 않도록해야합니다. 조립이 심각하게 느려 집니다. 어셈블리 소스 코드도 재분석해서는 안됩니다.

또한 점프와 레이블간에 일종의 상호 의존성 테이블을 미리 계산할 수 있으므로 레이블을 건너 뛰고 확장 된 점프 명령의 영향을받지 않는 점프 명령을 사용할 수 있습니다.

또 다른 고려해야 할 점은 짧은 점프가 127 바이트의 앞으로 거리를 가지고 있고 다음 명령이 127 바이트를 초과하고 대상 레이블이 여전히 나타나지 않을 때 가까운 점프로 변경할 수 있다는 것입니다 바로 뛰어 오르십시오. 어느 순간이 방법으로 가까이 갈 수있는 최대 64 개의 앞으로의 짧은 점프가있을 수 있습니다.

+0

나는 내 자신의 포스트에 대한 코멘트에서 simular 것을 제안했다. 당신 포스트는 훨씬 더 솔직한 솔루션이다. 나는 나 자신이 다른 점에 영향을 미칠 수있는 점프 하나를 바꾼 순간 당신 생각에 완전히 맞았다. 나는 누군가가 나와 동의한다는 것을 기쁘게 생각합니다, 이것은 내가 올바른 길을 가고 있음을 의미합니다. 많은 감사 드려요 :) – NibbleBits

+0

다른 질문으로 도와 드릴 수 있습니까? 아무도 대답하지 못했고 약 한 달이 지났습니다. http://stackoverflow.com/questions/41022380/omfobject-module-format-length-field-appears-incorrect – NibbleBits

+0

가능한 가까운 점프를 추적하는 데 너무 많은 시간이 걸리지 않습니다. (알렉세이 (Alexey)가 <64) 언급 한 것처럼 손에 가득 차 있기 때문에 시간을 절약 할 수 있습니다. 나는 (아마도 엄청난) cross-linked related-jumps-list보다이 옵션을 선호 할 것이다. 그리고 당신은 예측할 수 있습니다 : 2 점프가 열려 있고 이미'128-2x (점프 오픈 수)'바이트가 사용되면 둘 다 길어질 것입니다 – Tommylee2k

관련 문제