显示IP寄存器的内容

时间:2012-05-27 19:13:54

标签: assembly x86

我需要打印IP寄存器的内容。 (A86)。

我有中断处理程序:

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

但它打印了许多奇怪的符号:)

请告诉我出了什么问题。

P.S。我在汇编程序方面的知识很差。

2 个答案:

答案 0 :(得分:2)

您必须将二进制值转换为文本。 它必须是'$' - 终止字符串。然后将该字符串的地址加载到dx。

此外,您必须确保ds保持正确的值。

请注意:http://www.delorie.com/djgpp/doc/rbinter/id/73/25.html

答案 1 :(得分:0)

存在多个问题。

下面

ipp:
pop dx
print dx
ret

使用pop dx从堆栈中删除返回地址。你认为ret在你窃取其回信地址后会在哪里返回?你为什么不把地址放回堆栈?

此外,使用相同的pop dx,您会破坏被ISR中断的程序的dx寄存器值。为什么不在ISR中保存和恢复dx

还有一个......我不知道你的汇编程序,但是这行

lea dx, #1
看起来很奇怪。当您调用print dx这一行的宏时,IMO应转换为

lea dx, dx

这是一个无效的x86指令。你的代码是否完全编译?如果是这样,汇编程序对lea dx, dx做了什么?它是mov dx, dx还是nop还是删除/忽略它?

此外,int 21h的函数9显示一个“$” - 终止的ASCII字符串,其地址在ds:dx中,并且您不在代码中构造任何此类字符串。

您的代码永远不会设置ds,只会使用中断程序中出现的ds值,这很糟糕。如果要使用它,则需要保存并恢复ds。如果您的ISR数据将包含在ISR的代码段中,您希望加载ds,其值为cs

然后dxiret之前的偏移量为print dx。您确定要打印 {/ 1>}的值吗?您何时想知道ip及其中的值?

最后,为什么你有这个所有的ISR?

为什么不先没有ISR就让ip工作?为什么不使用调试器?