Вы не можете хранить 5 символов ASCII ("привет") в 2-байтовом регистре, который равен HL
.Единственное, что вы можете сделать, это сохранить эти 5 символов где-нибудь в памяти и загрузить HL
с адресом этой строки (фактически, адресом ее первого символа "h").
РЕДАКТИРОВАТЬ:
Если вам нужно найти местоположение вашей подпрограммы во время ее выполнения, вы можете прочитать адрес возврата из стека и затем минимально разобрать инструкцию непосредственно перед адресом возврата.
Если это CALL (cc,) nn
или JP (cc,) nn
, адрес подпрограммы закодирован в двух последних байтах инструкции.
Если это JP (HL/IX/IY)
, адрес находится в регистре (HL
, IX
илиIY
) используется для косвенного прыжка.Чтобы иметь возможность восстановить этот адрес, вам нужно сохранить значения этих регистров в своей подпрограмме (используя, например, PUSH
).
Если это RET (cc)
, адрес был в стеке, когда ваша подпрограммазапущен, но с тех пор он мог быть перезаписан действиями вашей подпрограммы или подпрограммами обработки прерываний.Это сложный случай, но я надеюсь, что это не RET
.
Вы не можете разбирать инструкцию вслепую и надежно одновременно, потому что разные инструкции имеют разную длину и то, что вы можете распознать как JP (HL)
на самом деле может быть просто частью более длинного CALL nn
.Но код, который вызывает вашу подпрограмму, вряд ли изменится, и есть вероятность, что есть только одно место или один метод вызова, что означает, что как только вы узнаете инструкцию, которая используется для вызова вашей подпрограммы, вам больше не нужно ничего угадывать, простонапишите свой код, предполагая, что это всегда такая инструкция.
Используя вышеописанную технику, вы можете использовать макет, предложенный в вопросе:
[код здесь] C9 - ВОЗВРАТ [СТРОКА ЗДЕСЬ]
Вам просто нужно восстановить адрес подпрограммы и добавить к ней размер подпрограммы.Это будет адрес строки.