我需要打印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。我在汇编程序方面的知识很差。
答案 0 :(得分:2)
您必须将二进制值转换为文本。 它必须是'$' - 终止字符串。然后将该字符串的地址加载到dx。
此外,您必须确保ds保持正确的值。
答案 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
。
然后dx
在iret
之前的偏移量为print dx
。您确定要打印 {/ 1>}的值吗?您何时想知道ip
及其中的值?
最后,为什么你有这个所有的ISR?
为什么不先没有ISR就让ip
工作?为什么不使用调试器?