2010-02-12 288 views
2

我非常喜歡菜鳥。我相信這是非常基本的,但我已經多次瞭解了這一點。我試圖讓我的程序在兩條不同的線上顯示一個字符串。這是一個.com程序,我正在使用A86編譯器。這是爲了HW,我不是在試圖欺騙或類似的東西,因爲我真的想知道我做錯了什麼。彙編語言

jmp start    ; This will start the program 

;============================ 

    msg db "Hello Word.$"  ; A string variable 
    msg db "Michael J. Crawley$" ; A string variable with a value. 

;============================ 

start: 

    mov ah,09    ; subfunction 9 output a string 

    mov dx,offset msg   ; DX for the string 

    int 21h    ; Output the message 

    int 21h    ; Output the message 

exit: 

    mov ah,4ch 
    mov al,00    ; Exit code 

    int 21h    ; End program 
+1

什麼是你的代碼有問題?它是否「編譯」?你得到奇怪的輸出?最好添加這個問題。 – glasnt 2010-02-12 04:16:14

回答

3

這裏有您的具體問題:

  • 您定義msg兩次(A86將BARF上)。
  • 你叫INT21 FN9與味精相同所以你不打印的兩個消息出來,只有兩個第一的副本。
  • 您沒有任何消息中換行符所以他們會彼此緊靠,而不是在不同的行。

到那些點的溶液(不設置實際的代碼)。

  • 將第二條消息標記爲msg2
  • 負載msg2到DX調用INT21第二次了。
  • 更改消息把一個換行符「$」符號之前(或至少是第一個)。

更新:這裏由於一些其他有用的靈魂已經提供了來源,是我的解決方案。我建議你從這裏學習並修改你自己的代碼來做類似的事情。如果你把它複製逐字從一個公共網站爲課堂作業,你幾乎肯定會被抓出來的抄襲:

  jmp start     ; This will start the program 

msg  db "Hello Word.",0a,"$" ; A string variable . 
msg2  db "Michael J. Crawley$" ; A string variable with a value. 

start: mov ah,09     ; subfunction 9 output a string 
     mov dx,offset msg   ; DX for the string 
     int 21h      ; Output the message 
     mov dx,offset msg2   ; DX for the string 
     int 21h      ; Output the message 
exit: 
     mov ah,4ch 
     mov al,00     ; Exit code 
     int 21h      ; End program 

此輸出:

Hello Word. 
Michael J. Crawley 
+0

不要DOS int21調用返回AX中的結果代碼,所以它必須在第二次調用之前重新加載?或者DOS只是設置進位標誌來指示錯誤。 – 2010-02-12 04:38:02

+0

@Michael,而不是fn9,它什麼都沒有返回。 – paxdiablo 2010-02-12 04:41:50

+1

不......我不是一個複製粘貼類型的人,我其實很想學習這個。 我會試試看。 – Michael 2010-02-12 05:01:10

1

msg?

+0

我不知道我的理解。我應該刪除一個.... db「Michael J. Crawley $」;帶有值的字符串變量。 – Michael 2010-02-12 04:25:26

+0

@Mike:不,他們每個人都需要獨特的名字。你可以用「msg1」替換第一個「msg」,用「msg2」替換第二個。 – Ponkadoodle 2010-02-12 04:55:35

0

我不熟悉的A86,而是用NASM & MASM您需要在com程序開始時使用「org 100h」彙編程序指令。現在的方式是,偏移msg是0x2,並且會嘗試從程序段前綴的第二個字節(一個16位字,包含可用內存頂部的段)打印。

+0

這就是爲什麼a86非常好,爲什麼哈拉德是如此的正確傲慢:-)它會組裝一個沒有其他彙編程序所需的gumpff文件的文件 - 我總是討厭masm,並且它的要求是我必須提供25行administrivia才能執行5行hello world程序。 Turbo Assembler拿走了很多,但是86一路走來。 – paxdiablo 2010-02-12 06:25:18