Assembly 显示IP寄存器的内容
我需要打印IP寄存器的内容。(a86) 我有一个中断处理程序:Assembly 显示IP寄存器的内容,assembly,x86,a86,Assembly,X86,A86,我需要打印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 但它打印了很多奇怪的符号:) 请告诉我怎么了 另外,我的汇编知识很差 您必须将二进制值转换为文本。 它必须是以“$”结尾的字符串。然后将该字符串的地址加载到dx 此外,您还必须确保ds
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
但它打印了很多奇怪的符号:)
请告诉我怎么了
另外,我的汇编知识很差 您必须将二进制值转换为文本。 它必须是以“$”结尾的字符串。然后将该字符串的地址加载到dx 此外,您还必须确保ds具有正确的值
请看:存在多个问题 这里 您可以使用
pop dx
从堆栈中删除返回地址。你认为ret
在你偷了它的回信地址后会在哪里回信?你为什么不把地址放回堆栈
此外,使用相同的pop dx
会损坏被ISR中断的程序的dx
寄存器值。为什么不在ISR中保存和恢复dx
还有一个。。。我不认识你们的装配工,但这行
lea dx, #1
看起来很奇怪。调用printdx
时,这一行宏IMO应转换为
lea dx, dx
这是一条无效的x86指令。你的代码编译了吗???如果是,您的汇编程序如何处理leadx,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的情况下工作?为什么不使用调试器呢?push ax,dx命令是否有效?是的,函数“print”可以正常工作。push ax,dx的功能是什么?我以前从未见过这样的语法。它起作用了。是的,也许这是一段糟糕的代码:)以多操作数版本的形式为push指令提供了一些语法上的糖分push-ax,dx
相当于push-ax
push-dx
您能告诉我如何将二进制值转换成文本吗?我不明白。。。对不起,我问了这么多愚蠢的问题
lea dx, dx