-1

我需要打印 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

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

请告诉我有什么问题。

PS我的汇编知识很差。

4

2 回答 2

2

您必须将二进制值转换为文本。它必须是“$”结尾的字符串。然后将该字符串的地址加载到 dx。

您还必须确保 ds 保持正确的值。

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

于 2012-05-27T19:18:41.537 回答
1

有多个问题。

这里

ipp:
pop dx
print dx
ret

您使用 . 从堆栈中删除返回地址pop dx。你认为ret你偷了它的返回地址后会返回哪里?为什么不把地址放回堆栈呢?

同样,pop dx您也会破坏dx被 ISR 中断的程序的寄存器值。为什么不在dxISR 中保存和恢复?

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

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.

然后dxiretbefore的偏移量print dx。您确定要打印ip吗?你什么时候想知道价值在ip哪里?

最后,您为什么要为所有这些设置 ISR?

您为什么不首先在ipp没有 ISR 的情况下完成您的工作?为什么不使用调试器?

于 2012-05-29T19:16:25.803 回答