考虑到以下类型的CALL语句,我无法清楚地理解这种差异。
CALL EAX
和
CALL DWORD PTR[EAX]
答案 0 :(得分:7)
CALL EAX
将调用eax
中的任何地址。如果eax
直接存储函数地址,这是正确的方法。
CALL DWORD PTR[EAX]
首先取消引用eax
中的任何地址并跳转到该结果。如果eax
存储函数指针,这是正确的方法。
答案 1 :(得分:6)
第一个表单调用其地址存储在eax中的函数。
第二个调用函数,其地址存储在内存位置,其地址依次存储在eax中(这只是一个间接级别)。
答案 2 :(得分:4)
CALL EAX
将获取EAX的值并跳转到该值。
CALL DWORD PTR [EAX]
将获取EAX的值,然后取消引用它(在内存中查找)然后调用它。
所以用C表示..
function_ptr=eax;
//v.s.
function_ptr=*eax;
或
(eax)();
//v.s.
(*eax)();