Можно ли сделать XOR несколькими элементами в ассемблере? - PullRequest
1 голос
/ 02 октября 2011

Просто интересно, можно ли будет XOR несколько байтов в ассемблере.Поскольку вы обычно делаете XOR, я просто не уверен, как это будет сделано.Любая помощь будет оценена, спасибо.

1 Ответ

4 голосов
/ 02 октября 2011

Расширенные архитектуры могут предоставить инструкции для этого. Фактически, тот, который я разработал много месяцев назад, имел 16-битную битовую маску, которая могла указывать любое количество регистров, которые вы хотели использовать для такой операции:

xor r3, bitmask

Каждый бит будет проверяться по очереди, и, если он установлен в 1, r3 будет xor 'с соответствующим регистром. Тем не менее, это только когда-либо существовал в качестве симулятора перед внедрением, и это было сочтено ненужным. Я полагаю, они посчитали, что в кремнии дешевле было позволить пользователю делать это вручную.

И продвинутые ассемблеры также могут предоставлять эту функциональность, возможно, позволяя написать:

xor r1, r2, r3, r4, r5, r6

и превращение его в эквивалент машинного языка:

xor r1, r2
xor r1, r3
xor r1, r4
xor r1, r5
xor r1, r6

Это, конечно, на самом деле не инструкция с несколькими аргументами на уровне машинного кода, просто ассемблер немного умнее. Это также не должно быть перепутано с реальными инструкциями, которые используют больше чем два аргумента с одним, являющимся местом назначения, таким как:

add r7, r3, r2     ; r7 = r3 + r2

Однако это то, что вы обычно делаете последовательно, особенно если вы не знаете значения, которые вы использовали заранее:

xor al, bl
xor al, 0x11

Если у вас есть константа элементов, которые вы хотите xor зарегистрировать, вы можете объединить их заранее, xor сначала, так как xor коммутативно:

(a xor b) xor c == a xor (b xor c)

Например, если вы хотите xor зарегистрировать с помощью 0x11, а затем 0x12, вы можете использовать:

xor al, 0x03     ; 0x03 is (0x12 xor 0x11)
...