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
не останавливает конвейер, но барьер памяти наносит большой ущерб, а также то, что центральному процессору нужно проделать большую работу, чтобы сделать его атомарным.
Связанный: