2017-05-10 4 views
0

タスク:アセンブラが文字列で動作する

最後に20文字を表示するプログラムを作成します。 私はしましたが、プログラムは47文字の長さの文字列でしか動作しませんでした。 どのような長さの線でも作業のための普遍的なプログラムを作る方法。

MASM:

.model small 
.stack 100h 
.data 
Original_string db 'Assembler language is the fatster in the world.',13,10,'$' 
Formed_line db 255 DUP(?) 

.code 
.386 
main: 
mov ax,@data; 
mov ds,ax; 
mov es,ax; 

mov dx,offset Original_string 
mov ah, 9 
int 21h 

cld 
mov ecx,LENGTHOF Original_string 
sub ecx, 27      ;47-20 =17 
mov esi,[OFFSET Original_string]+27 
mov edi,OFFSET Formed_line 
rep movsb 

mov dx,offset Formed_line 
mov ah,9 
int 21h 
mov ax,4C00h 
int 21h 
end main 

ありがとうございました。

答えて

0

「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+ecxend()(最初のバイトは'$')のアドレスで、-20はアドレスを20文字戻します。

実際には'$'は文字列ではなく文字列ターミネータであるため、おそらく-21を実行する必要があります。したがって、-20はわずか19文字(<EOL>文字を含む)を表示しています。

ecxが21以上の場合、最初にテストしなければならない入力を受け入れるジェネリックアルゴリズムの場合、短い/空の文字列の場合、-21アドレスは文字列の外に出ます。

あなたが最初の20個の文字を表示しなければならない場合、あなたはどちらかが'$'ターミネータでそれの21日のcharを破壊することによって、元の文字列を変更する必要があるでしょうか、出力が、それは(例えばint 21h,ah=2)により-CHAR-char型および20を数えますメモリ内でFormed_lineにコピーしてターミネータを追加しますが、最後の20文字にはその文字列は必要ありません。その文字列はそのままメモリに印刷する準備ができています。

+0

私は 'lea edx、[esi + ecx-20]'が16bリアルモードでは利用できないのではないかと心配しましたので、 'ecx'ではなく' bx'を 'lea dx ' [mov + dx、si] '' add dx、cx'' sub dx、20'は、16bリアルモードでも有効です。 – Ped7g

関連する問題