Pointers 您可以使用取消引用来调用程序集中函数的指针吗?

Pointers 您可以使用取消引用来调用程序集中函数的指针吗?,pointers,assembly,x86,masm,Pointers,Assembly,X86,Masm,听起来确实如此。 我将过程的偏移量加载到寄存器中,然后尝试调用该寄存器: MOV EBX, OFFSET MyProc CALL EBX 首先,我假设这将调用函数,但是当您调用一个过程时,您没有键入calloffset MyProc,您只需键入call MyProc。 在C语言中,您可以使用*操作符调用指向函数的指针:(*MyProc)()。 这让我想知道取消对函数指针的引用是否会调用该过程 呼叫[EBX] 然而,如果我取消引用它,masm告诉我需要指定一个大小,我知道我可以指定的唯一可能的大

听起来确实如此。 我将过程的
偏移量
加载到寄存器中,然后尝试调用该寄存器:

MOV EBX, OFFSET MyProc
CALL EBX
首先,我假设这将调用函数,但是当您调用一个过程时,您没有键入
calloffset MyProc
,您只需键入
call MyProc
。 在C语言中,您可以使用
*
操作符调用指向函数的指针:
(*MyProc)()。
这让我想知道取消对函数指针的引用是否会调用该过程

呼叫[EBX]

然而,如果我取消引用它,masm告诉我需要指定一个大小,我知道我可以指定的唯一可能的大小是
DWORD PTR
WORD PTR
,和
BYTE PTR
,我不认为一个过程具有特定的大小

总之,您可以通过直接将指针作为操作数提供给call指令来调用过程指针,还是必须在call指令中取消对指针的引用


感谢为什么不
调用OFFSET MyProc
-因为每次键入都会很烦人,而且不一致的语法不会给MASM创建者带来太多麻烦(考虑
mov-eax,var1
vs
mov-eax,[ebx]
,两者都是解引用内存)

调用[ebx]
将获取存储在
ebx
地址处的值,并将其用作最终目标地址,因此在您的情况下,它将尝试将过程的第一条指令解释为目标地址,并跳转知道在哪里的人(可能导致操作系统的非法访问崩溃)


在这种情况下,所需的大小不是典型的整数大小,而是跳转/调用地址大小,如
近PTR
远PTR
,这会影响将使用内存中的字节数(
近PTR
在32b模式下宽32b,而在实模式下宽16b(只是偏移部分),
远PTR
在实模式下宽32b)(16b偏移量+16b段)和32b保护模式下的48b(32b偏移量+16b段,其工作原理更像选择器或其他东西,我从未真正需要完全理解这一点,因此请查阅您最喜欢的x86文档/书籍以了解详细信息)

调用[ebx]
将获取存储在
ebx
地址处的值,并将其用作最终目标地址,因此在您的情况下,它将尝试将过程的第一条指令解释为目标地址,并跳转知道在哪里的人(可能导致操作系统的非法访问崩溃)


在这种情况下,所需的大小不是典型的整数大小,而是跳转/调用地址大小,如
近PTR
远PTR
,这会影响将使用内存中的字节数(
近PTR
在32b模式下宽32b,而在实模式下宽16b(只是偏移部分),
远PTR
在实模式下宽32b)(16b偏移量+16b段)和32b保护模式下的48b(32b偏移量+16b段,其工作原理更像选择器或其他东西,我从未真正需要完全理解这一点,因此请查阅您最喜欢的x86文档/书籍以了解详细信息)你是否已经尝试过<代码>调用EBX < /代码>?你验证过它没有做你需要的吗?因为我认为是这样的。你可以通过撤销指针来调用。当你使用<代码> dWord PTR < /代码>时,要考虑的是指针的大小,而不是函数的大小。如果你在32位,那么指针有32位,是S。DWORD的大小。因此应使用
DWORD PTR
。是否调用这样的函数取决于您,因为
call ebx
call DWORD PTR[ebx]不同在这种情况下,最好的办法是尝试一下,看看发生了什么!你试过了<代码>调用EBX < /代码>吗?你验证过它没有做你需要的吗?因为我认为是的。你可以通过撤销指针来调用。当你使用<代码> dWord PTR < /代码>时,要考虑的是指针的大小,而不是大小。函数。如果是32位,则指针有32位,大小为DWORD。因此应使用
DWORD PTR
。是否调用这样的函数取决于您,因为
call ebx
不同于
call DWORD PTR[ebx]
。在这种情况下,最好尝试一下,看看会发生什么!