2012-04-06 16 views
0

私は、画面上の文字列を表示するためにINT 21hをを使用しようとしているが、プログラムはすぐにクラッシュするようだ...コンソールに文字列を出力する - ASM 8086

を私はMASM

を使用しています。ここです私のコード:

.stack 200h 

    .data? 
     value dd ? 

    .data 
     item dd 0 
     str1 db 'Hello world!$' 
    .code 

start: 

; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ 


    mov edx, offset str1 
    mov al, 09h 
    int 21h 
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ 

end start 
+1

あなたは 'int 21h'が返ってから何をすべきかをコンピュータに伝えていませんでした。 –

+0

まあ、私はいくつかのプログラムを終了するように追加しようとしましたが、プログラムはまだクラッシュ...なぜですか? (btw私は7 64bit勝利を使用する) – Taru

+1

Um、64ビットWindowsはMS-DOSプログラムをサポートしていません。 –

答えて

2

いくつかの問題:

  1. あなたのプログラムはDOSへの出口が正しく、それだけでCPUが何らかのgarbagを実行することができますしません。 eはあなたのint 21hの後のメモリにあります。プログラムを終了するにはfunction 4chを使用してください。
  2. スタックが小さすぎる可能性があります。割り込みサービスルーチンと常駐プログラム、ドライバ(とおそらくDOSも)は、現在のスタックを使用します。いずれにしても200hバイト以上必要な場合は、スタックスペースがまだ残っていると思われるコードやデータがすべて上書きされます。それもクラッシュやハングを引き起こす可能性があります。サイズを1000hにバンプアップします。
  3. プログラムが実行されたプロセッサを指定していませんでした。問題は、i8086/8088、i80186、i80286とそのクローンでは当然利用できないi80386 +命令(mov edx, offset str1)を使用したことです。 Btw、DOSは32ビットのアドレスまたはオフセットをサポートしていません。 mov dx, offset str1である必要があります。

他にもあるかもしれませんが、最初に修正しましょう。

+0

こんにちは、私の最初のASMプログラムです^^、私は7 64ビットのインテルQ6600プロセッサを使用しています。 コンソールアプリケーションにはどのasm関数を使用する必要がありますか? – Taru

+0

いずれの場合も、プログラムの実行方法、実際に観察されているエラーや実際の行為、プログラムのコンパイル方法などの詳細情報を入力してください。 –

+0

MASMエディタですべて入力してから、 > Build All、 そしてcmdを使ってexeファイルを開き、それがクラッシュします。 – Taru

0

あなたが本当に8086を使用している場合、これを使用する: .MODEL小さな 組織100H .dataの メッセージDBに "Hello World $" .CODE メインPROC のmovああ、09H のMOV DX、オフセットメッセージ のint 21hを のmovああ、4chの のint 21hを ENDP

はるかに簡単かつクリーンな芋メイン 終了。

関連する問題