Z80 Asm - Hex Как создать строку - PullRequest
1 голос
/ 29 января 2012

Я предпочитаю кодировать на своем калькуляторе в шестнадцатеричном формате.Я знаю свои коды операций и что нет, но я не уверен, как создать строку "привет" в регистре HL.Можешь помочь?Я гуглил это, но трудно найти ответ, потому что большинство людей используют компиляторы, которые обрабатывают это для них.Я хочу сделать это трудным и сложным способом, хотя.Но я хочу наиболее эффективный способ сделать это в шестнадцатеричном виде.

Я пытался ....

[код здесь] C9 - ВОЗВРАТ [ЗДЕСЬ]

..Но, похоже, у LD нет способа получить относительные данные.Так что я даже не могу получить адрес места после C9.Любые советы?

Ответы [ 3 ]

1 голос
/ 29 января 2012

Помогает ли ?

Строки

Строки - это просто множество символов, соединенных в последовательном порядке.Тем не менее, важно определить начало / конец строк.Итак, вот как это делается:

Строки с нулевым символом в конце Строки, которые имеют нулевой термин или 0 в конце.Строки, где первый байт - это длина строки.

.DB 11,"String Data"

Когда вы делаете что-то со строками, это также выглядит полезным для строк с нулевым окончанием.

0 голосов
/ 29 января 2012

TI-83 + / 84 + Наверное? Программы начинаются с фиксированного адреса $ 9D95, поэтому вы можете вручную добавить смещение и использовать абсолютный адрес.

0 голосов
/ 29 января 2012

Вы не можете хранить 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 - ВОЗВРАТ [СТРОКА ЗДЕСЬ]

Вам просто нужно восстановить адрес подпрограммы и добавить к ней размер подпрограммы.Это будет адрес строки.

...