「fatster」 - 国際会議言語委員会はこれを認めておらず、進行中の食事はむしろうまくいったと考えられました。
コード内で値47,20,27
を配線しにくくするには、コードでの使用を最小限に抑えます。
mov ecx,LENGTHOF Original_string
入力引数で、このようなものは、ユーザーからの入力文字列を取る場合でも、(その後、代わりのmov ecx,<number>
あなたがstrlen
機能のいくつかの並べ替えを呼び出す必要があります)、常に存在します。 = OK
sub ecx, 27 ;47-20 =17
27は "最後の20個の文字に表示する" タスクに関連していない、それを他の方法を実行します。
mov esi,[OFFSET Original_string]+27
文字列の先頭のアドレスを再度入力引数であり、いくつかの形態では、いずれかの方法をコーディングするために提供されなければならないが、27は再びいくつかのハードコードされた中間値です。
基本的には、この入力(画面上の文字列を表示した後、シーケンスを開始)で作業を行うことができるはず:
mov esi,OFFSET Original_string
mov ecx,LENGTHOF Original_string
すべての更なるコードは唯一、二度とこれらの引数の値を再利用する必要がありますOriginal_string
ラベルを使用し、20
定数のみを使用します(タスクは「最後の20文字」です)。これらの3つの基本的な値から必要な中間値を1つおきに計算してください(何回もアクセスしなければならない値のコピーを保持してください)。
実際には、元の文字列から最後の20文字を実際に印刷するには、これらの入力は予想以上に簡単です。文字列がすでに終わり'$'
によって終了されるので、あなただけのことができます:
lea edx,[esi+ecx-20]
mov ah, 9
int 21h
完了。 esi+ecx
はend()
(最初のバイトは'$'
)のアドレスで、-20はアドレスを20文字戻します。
実際には'$'
は文字列ではなく文字列ターミネータであるため、おそらく-21を実行する必要があります。したがって、-20はわずか19文字(<EOL>
文字を含む)を表示しています。
ecx
が21以上の場合、最初にテストしなければならない入力を受け入れるジェネリックアルゴリズムの場合、短い/空の文字列の場合、-21アドレスは文字列の外に出ます。
あなたが最初の20個の文字を表示しなければならない場合、あなたはどちらかが'$'
ターミネータでそれの21日のcharを破壊することによって、元の文字列を変更する必要があるでしょうか、出力が、それは(例えばint 21h,ah=2
)により-CHAR-char型および20を数えますメモリ内でFormed_line
にコピーしてターミネータを追加しますが、最後の20文字にはその文字列は必要ありません。その文字列はそのままメモリに印刷する準備ができています。
私は 'lea edx、[esi + ecx-20]'が16bリアルモードでは利用できないのではないかと心配しましたので、 'ecx'ではなく' bx'を 'lea dx ' [mov + dx、si] '' add dx、cx'' sub dx、20'は、16bリアルモードでも有効です。 – Ped7g