听起来如何。我将OFFSET
一个过程加载到一个寄存器中,然后尝试调用该寄存器:
MOV EBX, OFFSET MyProc
CALL EBX
起初我会假设这会调用函数,但是当你调用一个你没有输入的过程时CALL OFFSET MyProc
,你只需输入CALL MyProc
. 在 C 中,您可以使用*
运算符调用指向函数的指针:(*MyProc)();
。这让我想知道取消引用该函数的指针是否会调用该过程。
CALL [EBX]
但是如果我取消对它的引用,MASM告诉我,我需要指定一个大小,唯一可能的大小,我知道的,我可以指定是DWORD PTR
,WORD PTR
和BYTE PTR
,我不认为一个过程是一个特殊的尺寸。
总而言之,您可以简单地通过直接将指针作为操作数提供给调用指令来调用指向过程的指针,还是必须在调用指令中取消引用指针?
谢谢
为什么不CALL OFFSET MyProc
- 因为每次输入都会很烦人,而且不一致的语法并没有给 MASM 创建者带来太多困扰(考虑mov eax,var1
vs mov eax,[ebx]
,两者都取消引用内存)。
该call [ebx]
会获取存储在值ebx
地址并用其作为最终的目标地址,所以在你的情况下,它会试图解释过程的第一个指令的目标地址,并跳转谁,知道,其中(可能是从OS导致非法访问崩溃) .
在这种情况下所需的大小不是经典的整数大小,而是跳转/调用地址大小,例如NEAR PTR
and FAR PTR
,这会影响将使用多少字节的内存(NEAR PTR
在 32b 模式下为 32b 宽,而在实模式下为 16b(只是偏移部分),FAR PTR
在实模式下是 32b(16b 偏移 + 16b 段),在 32b 保护模式下是 48b(32b 偏移 + 16b 段,它更像选择器或其他东西,我实际上从来不需要完全理解这个,所以请参阅你最喜欢的 x86 文档/book 了解详情)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句