1

電卓で16進数でコーディングすることを好みます。オペコードとそうでないものは知っていますが、レジスタHLに文字列「hello」を作成する方法がわかりません。手伝ってもらえますか?私はそれをグーグルで検索しましたが、ほとんどの人がそれを処理するコンパイラを使用しているため、答えを見つけるのは難しいです。しかし、私はこれを困難でやりがいのある方法でやりたいと思っています。しかし、16進数でそれを行う最も効率的な方法が必要です。

私は試した....

[ここにコード]C9-戻る[ここに文字列]

...しかし、LDには相対データを取得する方法がないようです。そのため、C9以降のアドレスの場所を取得することさえできません。任意のヒント?

4

3 に答える 3

1

これは役に立ちますか?

文字列

文字列は、連続した順序でまとめられたたくさんの文字です。ただし、文字列の開始/終了を識別することが重要です。だから、これがどのように行われるかです:

ヌル終了文字列nullの項、または末尾が0の文字列。

.DB "String Data",0

事前に決定された長さ文字列文字列ここで、最初のバイトは文字列の長さです。

.DB 11,"String Data"

文字列を使って作業しているので、これはnullで終了する文字列にも役立ちます。

于 2012-01-29T07:39:09.103 に答える
0

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-戻る[ここに文字列]

サブルーチンのアドレスを回復し、それにサブルーチンのサイズを追加する必要があります。それが文字列のアドレスになります。

于 2012-01-29T07:39:55.293 に答える
0

TI-83 + / 84 +だと思いますか?プログラムは固定アドレス$9D95から始まるため、手動でオフセットを追加して絶対アドレスを使用できます。

于 2012-01-29T17:06:39.493 に答える