2017-05-11 4 views
0

私は学校で新しいランゲージ(アセンブリ)を開始しています。そのクラスの作業を行う必要があります。私はDOSBox 0.74に取り組んでいます。 すべてのコンソールコンテンツバイザーをアレイに保存する機能が必要ですが、どうすればいいですか? 私はこれを試しました。コンソールバイザーの内容をアレイに保存する(アセンブリ)

salva_ecran proc 
     xor  bx,bx 
     mov  cx,25*80 

salva:   
     mov dl, es:[bx] 
     mov consoleText[bx], dl 
     inc bx 
     cmp bx, cx 
     jb salva 
     ret 
salva_ecran endp 

しかし、動作しませんでした。私の変数はconsoleText db 80 dup (25 dup (?),13,10)です。

ps:これは本当に新しいので、申し訳ありませんが、質問がばかげている、またはコードが悪く非効率的である場合。

答えて

1

consoleText定義はそうあなたが保存のために必要なすべてがconsoleText db 80*25 dup (?)で、あなたがmov consoleText[bx], dlによってそれらを上書きするよう80x27バイトは(25x82ない!)、およびそれらの13,10は、どのような方法役に立たないです。

mov dl, es:[bx]es0B800h(あなたのコードからは見えません)に設定されている場合、テキストモードのビデオRAMを読み取ることがあります。

しかし、80x25(モード03hだと思いますが)のテキストモードビデオRAMは文字あたり2バイトを使用します。ペアの最初のバイトは拡張ASCIIコードで、2番目のバイトは色付きの属性です。https://en.wikipedia.org/wiki/VGA-compatible_text_modeとその他のリソースを参照してください。だから、半分の文字と半分の色しか読んでいないので、mov dl, es:[bx*2]はリアルモードで動作します(または、bxの代わりにsiを使用します.16bリアルモードではbx*2アドレッシングモードを使用できません)。

新しい行は前の行の直後に始まり、ビデオRAMには13,10はありませんが、実際には有効なフォントグリフ(13は音符IIRC)ですので、最初の160バイトはB800:0000です。 80文字(色付き)の場合は、アドレス160(B800:00A0)に2行目がすぐに開始されます。

保存されたコンテンツをどのように確認/印刷するかはわかりませんので、「動作していません」とは言い難いです。期待どおりの値を取得することを確認するには、常にデバッガを使用します。

フルテキストモードのVRAMを保存/復元するには、もちろんカラー(80 * 25 * 2バイトバッファ)を保存して、それらを復元する必要があります。 VRAM、またはその他のVGAコントロールレジスタに出力に影響を与えます(つまり、プリミティブmov ax,3 int 10h状態のみ)。また、このようなストア/リストアはBIOSのカーソル位置やその他のBIOS変数を復元しないので、単に「コンソール」を保存したい場合は、VRAMコンテンツをコピーするだけではありません。

しかし全体的に見てみると、このコードは簡単で、ポイントまで理解できます。基本を学びながらパフォーマンスについて心配する必要はありません。しかし、デバッガを効果的に使用する方法を学ぶことは、あなたの将来(アセンブリ学習)にとって不可欠です。ペアになって、画面上の

0

文字数:文字や色、あなただけの可変サイズ倍増する必要があるので、(とカウンターを!):

.model small 
.stack 100h 
.data 

some_text db 'StackOverflow!',13,10,'$' 
consoleText db 80*25*2 dup(?) ;◄■■ * 2 

.code 
    mov ax, @data 
    mov ds, ax 

    mov ax, 0b800h 
    mov es, ax 

    mov ah, 9 
    lea dx, some_text 
    int 21h 

    call salva_ecran 

    mov ax, 4c00h 
    int 21h 

salva_ecran proc 
     xor  bx,bx 
     mov  cx,25*80 * 2 ;◄■■ * 2 

salva:   
     mov dl, es:[bx] 
     mov consoleText[bx], dl 
     inc bx 
     cmp bx, cx 
     jb salva 
     ret 
salva_ecran endp 
+0

感謝の男!あなたは私の問題を解決しました! :D –

+0

2000年のCXで 'rep movsw'と書いてみました。 ;) – Tommylee2k

+0

@JoãoRodrigues、私はまだ私の答えのチェックマークをクリックするのを待っている:) –