行反転問題を解決するためのアセンブラコードとアルゴリズムの例

指定-あるアドレスのメモリにあるヌル終了文字列 。 kukaga、0x0hとしましょう。

タスクは、逆に「agakuk」、0x0hの出力を取得することです

より正確には、反転された線があるメモリ領域へのポインタ



i 8080アーキテクチャに基づくソリューションを見てみましょう。



非x86アーキテクチャのアセンブラーの鑑定家へのリクエスト-おなじみのアーキテクチャのアセンブラーでこのタスクの例を示します。 比較するだけで純粋に興味深い。







最初のオプションはループアルゴリズムです。 空きメモリを逆さまにします。 最も重要なことは、記憶を超えないことです。 境界線の処理は、この例の範囲を超えています。



DE-文字列へのポインター



プッシュD

ポップh

DCX H

MVI M、0



ラベル1:

Xchg

MOV A、M

Xchg

MOV M、A

DCX H

Inx d

JNZ LABEL1

Inx h





HLでは、反転文字列へのポインター



2番目のオプション:



プッシュD

ポップh

DCX H

MVI M、0



ラベル1:

Xchg

MOV A、M

JZ LABEL2

Xchg

MOV M、A

DCX H

Inx d

JMP LABEL1



LABEL2:



DEでは、反転文字列へのポインター



何らかの再帰を伴うバリアント。 登録BC-行ごと。 ここでは、スタックがメモリ領域に登らないことも必要です。 また、境界は例の範囲を超えています。



プッシュB

ポップd

DCX D

Xchg

MVI M、0

Xchg



ラベル1:

LXI H、LABEL1

プッシュH

LDAX B

Inx b

DCX D

STAX D

CMP A

Rnz

ポップh

Inx d



DEでは、ラインナップへのポインター



尋ね、助言し、批判する



i8086のソリューションは、scasb、rep、movsbにすべて集約されるため、持ち込みませんでした。 簡単すぎる。 しかし、あなたが望むなら、私は書くことができます



All Articles