根據這個定義message db "Hello, DOS Here!", 0dh, 0ah
,接下來的代碼將打印完整的消息:
mov ah, 02h
mov dl, message ;Get the H character
int 21h
mov dl, message+1 ;Get the e character
int 21h
mov dl, message+2
int 21h
mov dl, message+3
int 21h
mov dl, message+4
int 21h
mov dl, message+5
int 21h
mov dl, message+6
int 21h
mov dl, message+7
int 21h
mov dl, message+8
int 21h
mov dl, message+9
int 21h
mov dl, message+10
int 21h
mov dl, message+11
int 21h
mov dl, message+12
int 21h
mov dl, message+13
int 21h
mov dl, message+14
int 21h
mov dl, message+15
int 21h
mov dl, message+16 ;Get the 0Dh carriage return
int 21h
mov dl, message+17 ;Get the 0Ah linefeed
int 21h
而是愚蠢,止跌」你說?
爲了使用一個循環,並獲得很多緊湊的代碼,我們需要:
- 把你的郵件地址中的地址寄存器。您可以從
SI
,DI
,BX
和BP
中進行選擇。我在下面的代碼中選擇了BX
。
- 在此地址讀取一個字節。
- 用DOS輸出字節。
- 遞增地址寄存器中的指針。
- 通過檢查您剛剛輸出的換行符是否爲所有文本重複步驟2,3,4,5。因爲在你的文本中,這是最後一個字符。
一個版本的循環:
mov bx, OFFSET message ;1.
Again:
mov dl, [bx] ;2.
mov ah, 02h ;3.
int 21h
inc bx ;4.
cmp dl, 0Ah ;5.
jne Again
我也應該使用push和pop要能夠打印字符串中的相同方法,但倒退。
爲了實現你的這個下一個任務,你會放一個push dx
在步驟2和3之間。然後寫一個額外的循環來顯示反轉的字符串:
Again2:
pop dx
mov ah, 02h
int 21h
cmp dl, "H"
jne Again2
的陷阱在這裏將這
- 你不應該輸出之前,其他(實際)字符換行和回車==>提示:在開始第二循環
前做2個
pop
小號
- 你不能輕易認爲「H」將只顯示爲文本的第一個字符==>提示:算
push
小號
數你有機會獲得一個調試器?第一步是瞭解它爲什麼要輸出字符9C。調試器可以幫助解決這個問題。問問你自己是否每次都做同樣的事情,以及它從哪裏獲得「9C」。 –
請參閱[Ralf Brown中斷列表](http://www.ctyme.com/intr/int-21.htm)。如果這看起來是一項家庭作業,那麼正確的做法是刷完筆記並最終在辦公時間訪問。 :)你的代碼顯示了缺乏x86彙編語言的基礎,我相信你不想在整個研究過程中拖動它。 –
不知道你的意思是你的最新評論瑪格麗特,但我正在盡我所能進一步瞭解我的材料。這只是我掌握的許多資源之一。就像生活中的其他事情一樣,從各個角度得到建議總是很好的。你永遠不知道誰有一招或兩個袖子!感謝Moby的建議。我相信這將是處理這種語言的重要工具。它實際上是非常深入的(只要我已經閱讀了足夠的能夠理解它......在這一點上工作)。 – Rifleman192