Я читаю «Компьютерные системы: перспектива программиста», глава 3 объясняет, что инструкция, и объяснение в книге смущает меня.mov инструкции и регистры - путаница!
дают функцию (страница 142 1 издание) Код
int exchange(int *xp, int y)
{
int x = *xp;
*xp = y;
return x;
}
Ассамблея сама функция
movl 8(%ebp), %eax //Get xp
movl 12(%ebp), %edx //Get y
movl (%eax), %ecx //Get x at *xp
movl %edx, (%eax) //Store y at *xp
movl %ecx, %eax //Set x as return value
Что меня смущает, это то, что будет храниться, и где
Вот как я это понимаю:
movl 8(%ebp), %eax //Get xp
Процессор перемещается +8 байт до стека (от указателя кадра %ebp
), принимает значение, хранящееся в этом месте, и сохраняет это значение в регистре %eax
(в упор - сохраняет значение, а не адрес)
Я прав? Спасибо!
ОЧЕНЬ верно ...... – ruslik
Итак, поскольку '% ebp' хранит указатель, мы используем круглые скобки вокруг его имени, чтобы указать, что мы получаем значение, сохраненное + 8байт от'% ebp'. В этом случае '8 (% ebp)' содержит указатель '* xp'. Позже в строке 'movl (% eax),% ecx' мы разыгрываем' xp' так же, как в первой строке кода сборки – newprint
Теперь все выпрямляется. Скорбь стала источником смятения! Благодаря ! – newprint