HL
인 2 바이트 레지스터에는 5 개의 ASCII 문자 ("hello")를 저장할 수 없습니다. 당신이 할 수있는 유일한 일은이 어딘가에 5 개의 문자를 메모리에 저장하고 HL
을이 문자열의 주소 (실제로는 첫 번째 문자 "h"의 주소)와 함께로드하는 것입니다.
편집 : 당신이 그것을 실행하는 동안에 당신의 서브 루틴의 위치를 찾을 필요가
, 당신은 스택에서 반환 주소를 읽은 후 최소한 단지 리턴 어드레스하기 전에 명령을 분해 할 수 있습니다.
CALL (cc,) nn
또는 JP (cc,) nn
인 경우 서브 루틴의 주소는 명령어의 마지막 두 바이트로 인코딩됩니다. 이 JP (HL/IX/IY)
의 경우
주소는 간접 점프에 사용되는 레지스터 (HL
, IX
또는 IY
)입니다. 이 주소를 복구하려면이 레지스터 값을 서브 루틴에 저장해야합니다 (예 : PUSH
사용).
RET (cc)
인 경우 주소는 서브 루틴이 시작될 때 스택에 있었지만 루틴의 활동 또는 인터럽트 서비스 루틴의 주소로 덮어 쓸 수 있습니다. 이것은 어려운 경우이지만, 그것이 RET
이 아니기를 바랍니다.
명령어의 길이가 다르고 인식 할 수있는 내용이 실제로 CALL nn
의 일부일 수 있으므로 CALL nn
의 일부일 수 있으므로 명령을 맹목적이고 안정적으로 동시에 분해 할 수는 없습니다. 그러나 서브 루틴을 호출하는 코드는 변경 될 가능성이 적습니다. 호출 할 곳이 하나 밖에 없으므로 서브 루틴을 호출하는 데 사용되는 명령어를 알게되면 더 이상 아무 것도 추측 할 필요가 없습니다. 항상 그 명령이라고 가정하여 코드를 작성하십시오.
위의 기술을 사용하여, 당신은 당신이 질문에 제안 된 레이아웃을 사용할 수 있습니다
[코드 여기] C9 - 당신은 서브 루틴의 주소를 복구하고 추가 할 필요가 RETURN [여기 STRING]
그것은 서브 루틴의 크기입니다. 그 문자열의 주소가됩니다.
이런 종류의 작업을 수행하는 일반적인 방법은 원하는 작업을 수행하는 코드를 컴파일 한 다음 컴파일러에서 수행하는 작업을 살펴 보는 것입니다. (생성 된 어셈블리 코드를 덤프하도록 컴파일러에 요청하는 방법이 있어야합니다.) –
컴파일러는 모든 쓰레기이며 제대로 작동하지 않습니다. –