您可以使用解除引用来调用指向程序集中函数的指针吗?
Can you use dereferencing to call a pointer to a function in assembly?
听起来确实如此。
我将过程的 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
与 mov eax,[ebx]
,两者取消引用内存)。
call [ebx]
将获取存储在 ebx
地址的值并将其用作最终目标地址,因此在您的情况下,它会尝试将过程的第一条指令解释为目标地址,并且jump who-know-where(可能导致来自 OS 的非法访问崩溃)。
这种情况下所需的大小不是经典整数大小,而是 jump/call 地址大小,如 NEAR PTR
和 FAR PTR
,这会影响将使用多少内存字节( NEAR PTR
在 32b 模式下是 32b 宽 vs 在实模式下是 16b(只是偏移部分),FAR PTR
在实模式下是 32b(16b 偏移 + 16b 段),在 32b 保护模式下是 48b(32b 偏移 + 16b 段,更像是选择器之类的东西,我实际上从来不需要完全理解这个,所以请咨询你最喜欢的 x86 documentation/book 了解详情)。
听起来确实如此。
我将过程的 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
与 mov eax,[ebx]
,两者取消引用内存)。
call [ebx]
将获取存储在 ebx
地址的值并将其用作最终目标地址,因此在您的情况下,它会尝试将过程的第一条指令解释为目标地址,并且jump who-know-where(可能导致来自 OS 的非法访问崩溃)。
这种情况下所需的大小不是经典整数大小,而是 jump/call 地址大小,如 NEAR PTR
和 FAR PTR
,这会影响将使用多少内存字节( NEAR PTR
在 32b 模式下是 32b 宽 vs 在实模式下是 16b(只是偏移部分),FAR PTR
在实模式下是 32b(16b 偏移 + 16b 段),在 32b 保护模式下是 48b(32b 偏移 + 16b 段,更像是选择器之类的东西,我实际上从来不需要完全理解这个,所以请咨询你最喜欢的 x86 documentation/book 了解详情)。