2012-05-27 97 views
-1

我需要打印IP寄存器的內容。 (A86)。顯示IP寄存器的內容

我不得不中斷服務程序:

int11: 
call ipp 
iret 

和程序IPP:

ipp: 
pop dx 
print dx 
ret 

與功能打印:

print macro 
push ax,dx 
lea dx, #1 
mov ah,9 
int 021 
pop dx,ax 

但它打印了很多奇怪的符號:)

Ple呃,告訴我什麼是錯的。

P.S.我在彙編方面的知識很差。

+0

是'推斧,dx'有效命令嗎? – Ruben

+0

是的,功能「打印」工作正常。 –

+0

推斧,dx是什麼?我從來沒有見過這樣的語法。 – zxcdw

回答

2

您必須將二進制值轉換爲文本。 它必須是以'$'結尾的字符串。然後將該字符串的地址加載到dx。

此外,您必須確保ds保持正確的值。

看:http://www.delorie.com/djgpp/doc/rbinter/id/73/25.html

+0

你能告訴我,如何將二進制值轉換爲文本,請?我不明白......對於我愚蠢的問題抱歉。 –

+0

看看http://forum.codecall.net/topic/65302-assembly-string-integer-algorithms-win32-nasm/ – Ruben

0

有多種問題。

這裏

ipp: 
pop dx 
print dx 
ret 

你從堆棧pop dx取出返回地址。你認爲ret會在你回收地址後返回嗎?你爲什麼不把地址放回棧中?

此外,使用相同的pop dx,您會破壞被ISR中斷的程序的dx寄存器值。爲什麼不在ISR中保存並恢復dx

還有另外一個......我不知道你的彙編,但此行

lea dx, #1 

看起來很奇怪。當你調用print dx此行的宏,國際海事組織,應轉化爲

lea dx, dx 

,這是一個無效的x86指令。你的代碼是否可以編譯?如果是這樣,您的彙編程序對lea dx, dx做什麼?它是否使它mov dx, dxnop或它刪除/忽略它?

更重要的是,int 21h的函數9顯示一個「$」 - 終止的ASCII字符串,其地址在ds:dx中,並且您不在代碼中構造任何此類字符串。

您的代碼永遠不會設置ds,只是使用任何ds值恰好在被中斷的程序中,這是不好的。如果你想使用它,你需要保存和恢復ds。如果ISR的數據將包含在ISR的代碼段中,則要裝入值爲csds

然後dxprint dx之前的偏移量爲iret。您確定要打印的值爲ip?你什麼時候想知道ip的價值和地點?

最後,爲什麼你有這個ISR?

爲什麼不先讓你的ipp在沒有ISR的情況下工作?爲什麼不使用調試器?