2バイトのレジスタに5つのASCII文字( "hello")を格納することはできませんHL
。あなたができる唯一のことは、これらの5文字をメモリのどこかに保存しHL
、この文字列のアドレス(事実上、最初の文字「h」のアドレス)をロードすることです。
編集:
実行中にサブルーチンの場所を見つける必要がある場合は、スタックからリターンアドレスを読み取り、リターンアドレスの直前で命令を最小限に分解できます。
CALL (cc,) nn
またはの場合JP (cc,) nn
、サブルーチンのアドレスは命令の最後の2バイトにエンコードされます。
の場合、アドレスは間接ジャンプに使用されるJP (HL/IX/IY)
レジスタ(HL
、、IX
または)にあります。IY
このアドレスを回復できるようにするには、これらのレジスタの値をサブルーチンに保存する必要があります(egを使用PUSH
)。
の場合RET (cc)
、サブルーチンの開始時にアドレスはスタック上にありましたが、それ以降、ルーチンのアクティビティまたは割り込みサービスルーチンのアクティビティによって上書きされている可能性があります。これは難しいケースですが、そうではないことを願っていRET
ます。
JP (HL)
異なる命令は異なる長さを持ち、実際には長いものの一部であると認識できるため、命令を盲目的かつ確実に同時に分解することはできませんCALL nn
。ただし、サブルーチンを呼び出すコードが変更される可能性は低く、呼び出しの場所またはメソッドが1つしかない可能性があります。つまり、サブルーチンの呼び出しに使用される命令がわかれば、もう何も推測する必要はありません。常にその命令であると想定してコードを記述します。
上記の手法を使用すると、質問で提案したレイアウトを使用できます。
[ここにコード]C9-戻る[ここに文字列]
サブルーチンのアドレスを回復し、それにサブルーチンのサイズを追加する必要があります。それが文字列のアドレスになります。