2016-10-20 18 views
1

私はアセンブリを学び、印刷で問題を解決することに成功しましたhere26行目以降のアセンブリでの印刷で文字が印刷されないのはなぜですか?

私は別の質問があります。

私はemu8086を使用しています。私は、このコードは、背景色を持つスペース文字を使用してミニオンのイメージをビット単位で印刷します。私はそれが1行にイメージを印刷させるように管理しましたが、26行目に達したときに印刷が中止され、「間違った割り込み」というエラーがあります。

誰でも助けてくれますか?

はここで全体のコードです:

org 100h 

name "charchar" 


org 100h 

;buhok line 1 (Grey) 
mov ax,0B800h 
mov es,ax 
mov di,56;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

;buhok line 2 
mov ax,0B800h 
mov es,ax 
mov di,200;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,092 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,202;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,092 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,208;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,210;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,214;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2         

mov ax,0B800h 
mov es,ax 
mov di,216;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2  

mov ax,0B800h 
mov es,ax 
mov di,218;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,222;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2  

mov ax,0B800h 
mov es,ax 
mov di,226;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,230;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,047 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,234;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,047 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

;buhok line 3 
mov ax,0B800h 
mov es,ax 
mov di,352;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,092 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,354;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,092 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,356;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,092 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,358;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,092 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,360;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,092 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,362;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,092 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,364;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,092 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,366;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,092 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,368;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,370;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,372;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,374;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,376;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,378;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,382;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,384;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,386;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,179 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,388;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,47 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,390;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,47 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,392;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,47 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,394;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,47 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,396;<target_address = y*160 + x*2> ; es:di set up 
mov ah,00001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,47 ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

........ 

;line 26 Hand, Body blue 

mov ax,0B800h 
mov es,ax 
mov di,4172;<target_address = y*160 + x*2> ; es:di set up 
mov ah,10001000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,' ' ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 
mov al,' ' ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 
mov al,' ' ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 
mov al,' ' ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 

mov ax,0B800h 
mov es,ax 
mov di,4188;<target_address = y*160 + x*2> ; es:di set up 
mov ah,11101000b;<color_attribute_for_whole_string> 
; now the print by letter gets here 
mov al,' ' ; al = letter, ah = attribute (ax set up) 
stosw  ; [es:di] = ax, di += 2 



    mov dl,0 ;X (SCREEN COORDINATE). 
    mov dh,5 ;Y (SCREEN COORDINATE). 
    int 10h ;BIOS SCREEN SERVICES. 

;FINISH THE PROGRAM PROPERLY. 
    mov ax,4c00h 
    int 21h 

ret 
+0

@ Ped7gこちらもお手伝いします。 –

+1

歴史的に、PCのテキストモードは25行に制限されています。 26行目は、ビデオRAMのメモリ範囲の外に(部分的に)あります。 Emu8086はそれがセグメンテーション違反であると考えるかもしれません。ちなみに、最後には「INT 10h」と呼んでいますが、最初に「AH」を2に設定することはありません。 –

+0

80x25の26行とは何ですか?たぶんもっと多くの行を使って他のテキストモードに切り替えることができますか? 80x50のような? https://en.wikipedia.org/wiki/VGA-compatible_text_mode#PC_common_text_modes ... 80x25では「26行目」が存在しないため、達成したいことがわかりません。 – Ped7g

答えて

3

ビデオセグメントとEMU8086の使用など0B800hの使用を考えると、それはあなたがの80x25のテキスト画面上で作業していることは明らかです。この画面の後ろにあるビデオRAMは合計4000バイトを占めます。あなたのプログラムがこのエリアの下の場所(mov di,4172mov di,4188を使用して)をアドレス指定するとき、効果的にオフスクリーンに書き込みます。

真のBIOS/DOS環境でこのコードを実行していた場合、これらのオフスクリーン書き込みは余分な表示ページに入るだけですが、これはEMU8086なのでこれらの余分な表示ページは存在しません。だから、これらの4000バイトの外に決して書き込むべきではありません。


@RuudあなたはのSetCursor機能のためのAHレジスタに機能コードを指定するのを忘れて言ったように。

mov dl, 0 ;X (SCREEN COORDINATE). 
mov dh, 5 ;Y (SCREEN COORDINATE). 
mov ah, 2 
int 10h ;BIOS SetCursor. 

;line 26 Hand, Body blue 

あなたはこのコメントの下に書き込む(しようと)しているラインではなくラインで、1画面行の最初の行を命名するので27

3840 -> 3999 line 25 
4000 -> 4159 line 26 
4160 -> 4319 line 27 <-- 4172 and 4188 belong here! 

mov ax,0B800h 
mov es,ax 

は、なぜあなたは、これらの命令何度も繰り返していますか? ESセグメントレジスタを正しい値に設定すると、1つの出力以上に設定されたままになります。

1

大きな問題は最後のint 10hah値がありません。その時点でah0xE8(手/ボディブルーの属性)であり、int 10hにはそのような機能はありません。

問題を記述する際にも、私が要約してみましょう、あなたが使用している数字についてしばらく考えてなど、あなたの表記ビットをクリーンアップ:

使用されるテキストモードもすることができます(解像度80×25の文字が含まれています他のモードを選択しようとすると、VGAはそれらのいくつかを持っています)。

文字のアドレスは(y * 80 + x) * 2であり、yは[0,24]であり、xは[0,79]である。x/yの最大有効値が、サイズ自体ではなく「サイズ-1」であることに注意してください。だからすでにy = 25は画面の表示領域から離れてしまいます。

これは、回線の説明に直接yの値を直接使用しているため、「回線1」→「回線25」ではなく、「回線0」から「回線24」を使用すると考えられます。

しかし、オフスクリーンエリアへの書き込みは、通常、VGA IBM PC上で有効な操作です。実際には、ビデオメモリの開始位置を移動するためにVGAカードのレジスタを使って実際のハードウェア(少なくとも実際のHWではemu8086についてはわかりません) B800:0000からさらに離れて、各チャーのビデオメモリ内容を書き換えることなく「高速スクロール」を作成します。あなたの例では、画面をスクロールしないと意味がありません。VGAコントロールレジスタの直接の変更は現時点では少し高度なトピックです。


多くの冗長性は、あなたのコードであり、(Fifoernikが述べたように)、esのセットアップは、ちょうど1それらのです。

また、mov di,396;<target_address = y*160 + x*2> ; es:di set up IMOのようなものは、何の利益もなくあなたを複雑にしています。

私は自分自身emu8086試すことはできませんが、mov di,2*160 + 38*2あなたが保つことを可能にするであろう、コンパイルされないならば、私は非常に驚くだろう「[x、y]が」解体中のコースのソースを(読んで、人間のために目に見える存在します出力されたマシンコードにコンパイルされた396の値だけが得られる)。

(私はemu8086を捨て、NASM + dosbox + DOSデバッガを使用することをお勧めします。また、多くのコントロールレジスタを含む非常にまともな方法でVGAをエミュレートします。 diはすでに392(あなたもいることを持っている間に、直接グラフィックカードの設定の古い時代を追体験、VGAのもののほとんどは、DOSBoxをして動作しない場合は、すべての必要があります)

そして、例えば、次のコードでmov di,390 ... stoswした後、あなたはmov di,392を行いますコメントstosw命令の後に)。 stoswオペレーションは、1行に連続した文字を書き込むために、必要に応じてahおよび/またはalを変更するだけでインターリーブされます。

ASCIIアートを作成してデバッガでコードをステップ実行し、レジスタがどのように変更されるかを監視し、CPUの仕組みをよりよく理解しようとすると、後で時間が節約されるはずです。より短いコードを書くことができます(ただし、読みやすいようにしてください)。

関連する問題