2016-03-21 4 views
0

imテ​​キストファイル全体をバッファに読み込んでコンソールに表示するアセンブリプログラムで作業しています。一度に80の幅* 25の高さのdossboxを使用しているので、24行を表示します(各行は最大80の長さを持っています)ので、ユーザーがテキストをスクロールできるようにユーザー入力を待ちます。アセンブリ8086 - あるバッファを別のバッファにコピー

各行の先頭に行番号を追加したいので、2番目のバッファを作成して最初の1バイトから1by1をコピーすることができたと思います。改行を見つけると、行番号をバッファに書き込んでから、バッファ全体に進むまで続けます。しかし、あるバッファから別のバッファにコピーする私の方法は悪いです。

だから私はBUFFBする ブッファをコピーしたい:

mov di,OFFSET BUFFB ;so i set di to the beggining of bufferB 




mov si,Pos   ;Pos is my position in the first buffer 
lea bx,BUFFA[si] ;move the content of buffA to bx , i think the problem is here 
mov [di],bx  ;move to the addres of di the content of bx 
inc di 
inc Pos 

問題は、私は第2のバッファの内容をプリントアウトしたときに、私は(順位と同じ)、SIの値をコピーすることを見つけるである私ににbufferA [si]の内容ではありません。このコードを修正するにはどうしたらいいですか?

編集1:

だから、解決策は、MOVを使用していると、アルは登録:

mov si,Pos 
mov al,[BUFF + si] 
mov [di],al 
inc di 
+1

'lea'(ロード拡張アドレス)は、コンテンツの引数ではなく_address_をロードします。実際にはここに 'mov 'が必要です。 –

+0

あなたの速い答えはtyですが、mov bx、オフセットBUFFB [si]は法的な操作ではありません – Shaoe

+0

'offset'部分を削除します。 –

答えて

5

あなたは

lodsb 

代わりの

mov al,[si] 
inc si 

を使用することができます最高の例で
stosb 

代わりの

mov [di],al 
inc di 

、あなたがコピーするバイト数を知っていれば、あなたも「担当者」を使用してメモリ・ブロックを移動することができます

movsb ; move byte at [si] to [di], and increase both indices 

に両方を組み合わせることができますCX時間後に命令を繰り返す:

cld     ; make sure that movsb copies forward 
mov si, source_buffer 
mov di, dest_buffer 
mov cx, #amount of bytes to copy 
rep movsb 

のまたは埋めるメモリブロック

cld     ; make sure that stosb moves forward 
mov si, buffer  ; start here 
mov al, 0xFF   ; fill with 0xFF 
mov cx, #20   ; 20 times 
rep stosb 

あなたがlodsw、STOSWを使用し、どちらか
行くことができ

すべての手順をMOVSW、代わりにバイトの言葉を使用している場合 - とき方向前方(INCのSI /ジ) (CLD経由)または
- 後方(DEC si/di)のいずれかを選択します。方向フラグが設定されているとき(STD経由)

+1

答えを改善するには、 'CLD'命令を含めます。それは文字列プリミティブでは非常に重要であり、あまりにもしばしば無視されます。 – Fifoernik

+0

ありがとうございます。私もいくつかの間違いを訂正するためにあなたの答えを編集しました(おそらく急いでですか?)Upvoted! – Fifoernik

関連する問題