Assembly 难以理解不同类型的call语句

Assembly 难以理解不同类型的call语句,assembly,reverse-engineering,Assembly,Reverse Engineering,考虑到以下几类CALL语句,我无法清楚地理解它们之间的区别 CALL EAX 及 第一个表单调用其地址存储在eax中的函数 第二个调用其地址存储在内存位置的函数,其地址依次存储在eax中(这只是一个更高级别的间接寻址) 将调用eax中的任何地址。如果eax直接存储函数地址,这是正确的方法 CALL DWORD PTR[EAX] CALL EAX 将首先取消引用eax中的任何地址,并跳转到该地址的结果。如果eax存储函数指针,这是正确的方法 CALL DWORD PTR[EAX] CALL

考虑到以下几类CALL语句,我无法清楚地理解它们之间的区别

CALL EAX


第一个表单调用其地址存储在eax中的函数

第二个调用其地址存储在内存位置的函数,其地址依次存储在eax中(这只是一个更高级别的间接寻址)

将调用
eax
中的任何地址。如果
eax
直接存储函数地址,这是正确的方法

CALL DWORD PTR[EAX]
CALL EAX
将首先取消引用
eax
中的任何地址,并跳转到该地址的结果。如果
eax
存储函数指针,这是正确的方法

CALL DWORD PTR[EAX]
CALL EAX
将获取EAX的值并跳转到该值

CALL DWORD PTR [EAX]
将获取EAX的值,然后取消引用(在内存中查找),然后调用它

所以用C来表示

function_ptr=eax;
//v.s.
function_ptr=*eax;


我们可以通过引入额外的间接层次来解决任何问题-巴特勒·兰普森
(eax)();
//v.s.
(*eax)();