2012-04-06 70 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'返回後要做什麼。 – 2012-04-06 13:40:18

+0

好吧,我試圖添加一些喜歡退出程序,但程序仍然崩潰......爲什麼? (順便說一句,我使用WIN 7 64位) – Taru 2012-04-06 13:44:50

+1

Um,64位Windows不支持MS-DOS程序。 – 2012-04-06 13:45:41

回答

2

的幾個問題:

  1. 你的程序不退出到DOS正確,它只是讓CPU執行任何garbag e在你的int 21h後面的記憶中。使用function 4ch終止您的程序。
  2. 您的堆棧可能太少。中斷服務例程和駐留程序,包括的驅動程序(可能還有DOS)使用當前的堆棧。如果他們隨時需要超過200h字節,他們會覆蓋任何代碼或數據,而這些代碼或數據恰好在他們認爲還有一些堆棧空間的地方。這也可能導致崩潰或掛起。將尺寸提高到1000h
  3. 你沒有指出你的程序在哪個處理器上運行。問題是,您使用了i80386 +指令(mov edx, offset str1),這在i8086/8088,i80186和i80286及其克隆上自然不可用。順便說一下,DOS不支持32位地址或偏移量。它應該是mov dx, offset str1

可能還有別的東西,但我們先來修復它們。

+0

你好,這是我在ASM上的第一個程序^^,我使用win 7 64位,Intel Q6600處理器。 那麼,我應該使用控制檯應用程序的asm函數? – Taru 2012-04-06 13:52:46

+0

無論哪種情況,請提供有關如何運行程序的更多信息,您實際*觀察到的錯誤或不當行爲,如何編譯程序等。 – 2012-04-06 13:54:27

+0

我在MASM編輯器中鍵入所有內容,然後按Project- >全部構建, ,然後通過cmd我打開exe文件,然後它崩潰... – Taru 2012-04-06 14:12:48

0

如果你真正使用8086,使用: .MODEL小 組織100H 。數據 消息分貝的 「Hello World $」 .CODE 主PROC MOV啊,09H MOV DX,偏移消息 INT 21H MOV啊,四路 INT 21H ENDP 結束主

更簡單和更清潔海事組織。