2012-01-29 2 views
1

필자는 계산기에서 16 진수로 코드를 작성하는 것을 선호합니다. 나는 내 opcode를 안다.하지만 레지스터 HL에 문자열 "hello"를 만드는 방법을 모르겠다. 너 도움이 되니? 나는 그것을 봤지만 대부분의 사람들이 그것을 처리하는 컴파일러를 사용하기 때문에 대답을 찾기가 어렵다. 나는 이것을 어렵고 도전적인 방법으로하고 싶다. 그러나 나는 그것을 16 진수로 수행하는 가장 효율적인 방법을 원한다.Z80 Asm - Hex 문자열 작성 방법

내가 시도 ....

[여기 코드] C9 - RETURN [STRING 여기]

...하지만 LD는 상대적으로 데이터를 얻을 수있는 방법이 보이지 않는다. 그래서 나는 C9 이후의 주소 위치조차도 얻을 수 없다. 어떤 팁?

+0

이런 종류의 작업을 수행하는 일반적인 방법은 원하는 작업을 수행하는 코드를 컴파일 한 다음 컴파일러에서 수행하는 작업을 살펴 ​​보는 것입니다. (생성 된 어셈블리 코드를 덤프하도록 컴파일러에 요청하는 방법이 있어야합니다.) –

+0

컴파일러는 모든 쓰레기이며 제대로 작동하지 않습니다. –

답변

0

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]

그것은 서브 루틴의 크기입니다. 그 문자열의 주소가됩니다.

+0

나는 HL에 저장할 수 없다는 것을 안다. 그러나 어떻게 그들을 메모리에 저장할 것인가? 나는 기억할 주소가 무엇인지 알지 못한다. 0 –

+0

으로 문자열을 종료해야한다는 것을 알고 있습니다.하지만 어떻게 든 코드를 찾을 곳을 찾았습니까? –

+0

답변의 업데이트를 참조하십시오. –

1

this이 도움이 되나요?

문자열

문자열은 연속적인 순서로 조립 문자 만 많이 있습니다. 그러나 문자열의 시작/끝을 식별하는 것이 중요합니다. 그러면 다음과 같이 수행됩니다.

null 종결 문자열 null 용어 또는 끝에 0이있는 문자열.

.DB "String Data",0 

첫번째 바이트는 문자열의 길이 소정의 문자열 길이 문자열

. 널 (null)에 대한

.DB 11,"String Data" 

당신이 문자열 일을하고있는 것처럼, this also looks useful 문자열을 종료했습니다.

+0

그건 도움이되지 않습니다. 나는 asm 컴파일러에서 이것을하려고하지 않는다. 나는 그 일을하는 법을 이미 알고있다. 나는 이것을 계산기에서 16 진수로 직접하고있다. 그래서 내가 올바르게하는 법을 알아야합니다. –

+0

오, crikey, 나는 q를 올바르게 읽지 않았다. 행운을 빈다. – IanNorton

0

TI-83 +/84 + 추측 하시겠습니까? 프로그램은 고정 주소 $ 9D95에서 시작하므로 수동으로 오프셋을 추가하고 절대 주소를 사용할 수 있습니다.