Учитывая следующие виды операторов CALL, я не могу ясно понять разницу.
CALL EAX
и
CALL DWORD PTR[EAX]
Позвонит на любой адрес в eax.Если eax непосредственно хранит адрес функции, это правильный путь.
eax
Сначала разыменовывает любой адрес в eax и переходит к результату этого.Если eax хранит указатель на функцию, это правильный путь.
Первая форма вызывает функцию, адрес которой хранится в eax.
Вторая вызывает функцию, адрес которой хранится в ячейке памяти, адрес которой, в свою очередь, хранится в eax (это просто еще один уровеньКосвенная).
примет значение EAX и перейдет к этому значению.
CALL DWORD PTR [EAX]
примет значение EAX, затем разыменует его (ищет его в памяти) и затем вызывает его.
так в терминах C ..
function_ptr=eax; //v.s. function_ptr=*eax;
или
(eax)(); //v.s. (*eax)();