我需要打印 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我的汇编知识很差。
您必须将二进制值转换为文本。它必须是“$”结尾的字符串。然后将该字符串的地址加载到 dx。
您还必须确保 ds 保持正确的值。
有多个问题。
这里
ipp:
pop dx
print dx
ret
您使用 . 从堆栈中删除返回地址pop dx
。你认为ret
你偷了它的返回地址后会返回哪里?为什么不把地址放回堆栈呢?
同样,pop dx
您也会破坏dx
被 ISR 中断的程序的寄存器值。为什么不在dx
ISR 中保存和恢复?
还有一个...我不知道你的汇编程序,但是这条线
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
.
然后dx
有iret
before的偏移量print dx
。您确定要打印的值ip
吗?你什么时候想知道价值在ip
哪里?
最后,您为什么要为所有这些设置 ISR?
您为什么不首先在ipp
没有 ISR 的情况下完成您的工作?为什么不使用调试器?