Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 显示IP寄存器的内容_Assembly_X86_A86 - Fatal编程技术网

Assembly 显示IP寄存器的内容

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

我需要打印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具有正确的值


请看:

存在多个问题

这里

您可以使用
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