Как работает xchg в Intel Assembly Language - PullRequest
0 голосов
/ 30 апреля 2018

Может кто-нибудь объяснить, как работает xchg в этом коде? Учитывая, что arrayD является массивом DWORD 1,2,3.

mov eax, arrayD ; eax=1
xchg eax, [arrayD+4]; eax=2 arrayD=2,1,3

Почему не массив 1,1,3 после xchg?

1 Ответ

0 голосов
/ 30 апреля 2018

xchg работает , как сказано в документации Intel .

Я думаю, что комментарий во 2-й строке неправильный. Это должно быть eax=2, arrayD = 1,1,3. Итак, вы правы, и вы должны написать своему инструктору по электронной почте, чтобы сказать, что вы нашли ошибку, если вы что-то не заметили в своих заметках.

xchg хранит только один элемент, и он не может волшебным образом оглянуться назад, чтобы узнать, откуда взято значение в eax, и поменять две ячейки памяти одной инструкцией xchg.

Единственный способ поменять 1,2 на 2,1 в одной инструкции - это 64-битное вращение, например rol qword ptr [arrayD], 32 (только для x86-64).


Кстати, не используйте xchg с операндом памяти, если вы заботитесь о производительности. Он имеет неявный префикс lock, поэтому он является полным барьером памяти и занимает около 20 циклов ЦП в Haswell / Skylake (http://agner.org/optimize/). Конечно, несколько команд могут выполняться одновременно, но xchg mem,reg равно 8 мопс, против 2 для отдельной загрузки + хранилища. xchg не останавливает конвейер, но барьер памяти наносит большой ущерб, а также то, что центральному процессору нужно проделать большую работу, чтобы сделать его атомарным.

Связанный:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...