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

指定-あるアドレスのメモリにあるヌル終了文字列 。 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にすべて集約されるため、持ち込みませんでした。 簡単すぎる。 しかし、あなたが望むなら、私は書くことができます

Source: https://habr.com/ru/post/J27474/


All Articles