我需要打印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.我在彙編方面的知識很差。
我需要打印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.我在彙編方面的知識很差。
您必須將二進制值轉換爲文本。 它必須是以'$'結尾的字符串。然後將該字符串的地址加載到dx。
此外,您必須確保ds保持正確的值。
你能告訴我,如何將二進制值轉換爲文本,請?我不明白......對於我愚蠢的問題抱歉。 –
看看http://forum.codecall.net/topic/65302-assembly-string-integer-algorithms-win32-nasm/ – Ruben
有多種問題。
這裏
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, dx
或nop
或它刪除/忽略它?
更重要的是,int 21h的函數9顯示一個「$」 - 終止的ASCII字符串,其地址在ds:dx
中,並且您不在代碼中構造任何此類字符串。
您的代碼永遠不會設置ds
,只是使用任何ds
值恰好在被中斷的程序中,這是不好的。如果你想使用它,你需要保存和恢復ds
。如果ISR的數據將包含在ISR的代碼段中,則要裝入值爲cs
的ds
。
然後dx
在print dx
之前的偏移量爲iret
。您確定要打印的值爲ip
?你什麼時候想知道ip
的價值和地點?
最後,爲什麼你有這個ISR?
爲什麼不先讓你的ipp
在沒有ISR的情況下工作?爲什麼不使用調試器?
是'推斧,dx'有效命令嗎? – Ruben
是的,功能「打印」工作正常。 –
推斧,dx是什麼?我從來沒有見過這樣的語法。 – zxcdw