Понимание инструкции pop в сборке - PullRequest
0 голосов
/ 16 сентября 2018

Я студент, изучающий компьютерные системы впервые (ж / Компьютерные системы: Перспектива программиста).Мы работаем над сборкой, и я начинаю понимать суффиксы команд для x86_64, такие как leaq в таком виде:

leaq (%rsp, %rdx), %rax

Однако я не могу понять, используя суффиксдля pop.Например, используя ту же логику, для меня было бы разумно использовать popl для чего-то вроде:

popl %edi

Но в тексте и других примерах онлайнЯ просто вижу:

pop %edi

В чем разница?popl даже действителен?Просто ищу немного больше понимания.Все помогает, спасибо.

1 Ответ

0 голосов
/ 16 сентября 2018

То, что вы можете сделать в asm, ограничено возможностями оборудования.Неявный или явный размер операнда в исходном коде (суффикс или нет) не меняет машинный код, к которому он будет собираться.

Поэтому правильный вопрос, который нужно задать, заключается в том, может ли аппаратное обеспечение выполнить 32-разрядную передачу.в 64-битном режиме?Нет, не может, поэтому не существует синтаксиса исходного кода asm, который заставил бы его делать именно то, что вы пытались сделать с одной инструкцией.

Вот почему вашассемблер не примет pop %edi или popl %edi.Они в точности эквивалентны, потому что 32-битный регистр подразумевает размер операнда DWORD (l). Примеры, которые вы видели для popl или pop %edi, относятся к 32-битному режиму, , где EDI - полный регистр вместо младшей половины RDI, и эта инструкция кодируется.

Вам нужен суффикс размера, только если он неоднозначный, mov $1, (%rdi).Ваш ассемблер выдаст за это ошибку, вместо того, чтобы угадать одно из ч / б / л / q.

Но push является немного особенным: push $1 по умолчанию будет 64-битным, даже если pushw $1 возможно. Сколько байтов команда push помещает в стек, если я не указал размер операнда?

...