2008-09-18 48 views
0

我有一些代碼應該顯示一條短消息。下面是相關代碼:什麼會導致彙編語言程序顯示「垃圾」?

DATA SEGMENT 'DATA' 
MSG DB 0AH, 0DH, 'Hello, Adam', '$' 
CHAR DB 00H 
DATA ENDS 

CODE SEGMENT 'CODE' 
PRINT_MSG: 
    MOV AH, 09H ;Command to print string of characters 
    MOV DX, OFFSET MSG ;Mov address of message into DX 
    INT 21H  ;DOS Interrupt 
    JMP WAITING ;Loop back to waiting state 
CODE ENDS 

,輸出是:

E:\ece323\software\lab2>MAIN.EXE 
?F ^?¶ ? N? ?    -!- 

Hello, Adam- 

這到底是怎麼回事?

+3

我不禁注意到你沒有接受,投票或評論任何答案;他們都沒有幫你做作業嗎? – 2008-09-19 17:21:40

回答

2

我的猜測是你的DS沒有指向你的數據段。

Int21函數0x09取DS:DX中的字符串。

請記住,DX只是一個16位寄存器。要訪問16位範圍以外的數據,您必須使用段寄存器。這些被稱爲數據的DS和ES,代碼的CS和堆棧的SS(在i386上也有FS和GS)。

加載的確切地址由16 * segment_register + offset_register給出。 Int21無法猜測DS的位置,因此必須在調用中斷之前加載它。

我想你從來沒有初始化你的DS寄存器,所以它很可能指向代碼而不是數據段。

嘗試更換您的

MOV DX, offset MSG 

由:

LDS DX, MSG ; Check that, it's been ages since I've written 16 bit code. 

Unfortunatley它已經多年,因爲我已經最後的16位彙編發揮,所以我不能籤,但應該LDS做的伎倆。

您也可以間接地在你的程序啓動這樣的加載DS的東西:

MOV AX, SEG DATA ; check that - can be SEGMENT or so as well. 
    MOV DS, AX 
-1

我的猜測是,你可能不會在「真實」的模式,這是需要在一般的MSDOS程序運行(和特定的21h中斷)工作。

自Windows 95以來,Windows一直以「受保護」模式運行;命令提示符一直處於保護模式,因爲我認爲,Windows 2000.

您可能想嘗試創建快捷方式EXE,然後在快捷方式中設置兼容性選項。

+1

Windows命令提示符將模擬所有這些東西給你,並讓你調用int21就好了。所有DOS程序(.EXE和.COM)都以16位模式啓動。 無需設置兼容性選項。 – 2008-09-18 13:56:28

0

嘗試下面的變化:

DATA SEGMENT 'DATA' 
ERROR_MSG DB 'DS:DX is wrong' 
MSG DB 0AH, 0DH, 'Hello, Adam', '$' 
CHAR DB  00H 
DATA ENDS 

如果錯誤消息顯示然後DS:DX是錯誤的,所以無論是DS不指向數據段,或「OFFSET MSG」是錯誤的一些原因...我的asm很生鏽,但是嘗試使用ADDR代替OFFSET(?)

如果錯誤消息沒有顯示,問題在執行到達PRINT_MSG之前發生。

0

Nils是對的,需要設置DS寄存器才能使用int 21的這個函數。先嚐試第二部分與EAX轉換,它應該可以工作。

並且在字符串之後沒有必要在0個字符中。第9個函數不能使用以空字符結束的字符串,這個'$'字符的作品而不是0.

0

看起來像你顯示的是PSP的一部分。這是一個.COM任何機會?如果您忘記ORG 100h彙編程序指令,則OFFSET不會指向您認爲它們應該在的位置......作爲一個有趣的方面說明,從MOV OFFSET切換到LEA也將「工作」。 MASM很聰明,能夠弄清楚你在使用LEA時所做的事情,而不是使用OFFSET(是的,我很久以前就學會了這種困難的方法...... :-))。