Я прочитал книгу, в которой написана следующая программа на C, и согласен с вызовом этой функции для кода ассемблера:
int *p; /* pointer to integer */
int foo (int n, int *q) {}
/* function get int and pointer to int, returns int */
/* Now, let's call the function: */
*p = foo (*p, p);
Она преобразуется в:
MOV EBX, [P]
PUSH EBX
PUSH DWORD [EBX]
CALL foo
MOV EBX, [P]
MOV [EBX], EAX
ADD ESP, 8
Я не сделалЯ не понимаю, почему это правильно, как я понял, код должен выглядеть следующим образом:
MOV EBX, P ;; **CHANGE**
PUSH EBX
PUSH DWORD [EBX]
CALL foo
MOV EBX, P ;; **CHANGE**
MOV [EBX], EAX
ADD ESP, 8
и потому, что P является указателем.Если мы сделаем MOV EBX, [P]
, как предполагает книга, мы получим целое число (не адрес), а затем, если мы сделаем PUSH DWORD [EBX]
, мы получим незаконное указание.
Где я ошибаюсь?