Assembler & C - перевод кода C на ассемблер - PullRequest
1 голос
/ 23 марта 2012

Я прочитал книгу, в которой написана следующая программа на 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], мы получим незаконное указание.

Где я ошибаюсь?

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

P - это метка, которая соответствует адресу переменной (вашей переменной-указателя).[P] будет значением по этому адресу, который является указателем.

Обратите внимание, однако, что некоторые ассемблеры делают вещи немного по-другому.NASM и его производные довольно строги относительно скобок и тому подобного.МАСМ, не так много;В некоторых случаях он позволяет вам обрабатывать метку почти так же, как если бы она была отдельной переменной.

1 голос
/ 23 марта 2012

P предполагается внутри функции, подобной этой:

void foo(){
  int *p;    /* pointer to integer */
  int foo (int n, int *q) {}
  /* function get int and pointer to int, returns int */

  *p = foo (*p, p);
}

В этом случае P будет "местоположением переменной" или "меткой" в терминах сборки.Поскольку P обычно выделяется в стеке в его случае, это означает, что когда вы делаете *p=10;, вы фактически делаете что-то вроде этого:

mov EBX,[p] ;; get the value of the p variable (a pointer)
mov [EBX],10 ;; dereference the value of p and assign it to 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...