сложность понимания различных видов операторов вызова - PullRequest
3 голосов
/ 24 июня 2011

Учитывая следующие виды операторов CALL, я не могу ясно понять разницу.

CALL EAX

и

CALL DWORD PTR[EAX]

Ответы [ 3 ]

7 голосов
/ 24 июня 2011
CALL EAX

Позвонит на любой адрес в eax.Если eax непосредственно хранит адрес функции, это правильный путь.

CALL DWORD PTR[EAX]

Сначала разыменовывает любой адрес в eax и переходит к результату этого.Если eax хранит указатель на функцию, это правильный путь.

6 голосов
/ 24 июня 2011

Первая форма вызывает функцию, адрес которой хранится в eax.

Вторая вызывает функцию, адрес которой хранится в ячейке памяти, адрес которой, в свою очередь, хранится в eax (это просто еще один уровеньКосвенная).

4 голосов
/ 24 июня 2011
CALL EAX

примет значение EAX и перейдет к этому значению.

CALL DWORD PTR [EAX]

примет значение EAX, затем разыменует его (ищет его в памяти) и затем вызывает его.

так в терминах C ..

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

или

(eax)();
//v.s.
(*eax)();
...