В первые дни циклы памяти и процессора были недостаточны. Это приводит к множеству так называемых «оптимизаций». Давайте посмотрим на код:
move.l #0, d0
moveq.l #0, d0
sub.l a0,a0
Для первой инструкции потребуются два байта для кода операции, а затем четыре байта для значения (0). Это означало, что было потрачено четыре байта, плюс вам понадобится дважды обратиться к памяти (один раз для кода операции и один раз для данных). Sloooow.
moveq.l был лучше, так как он объединял данные в код операции, но позволял записывать значения только от 0 до 7 в регистр. И вы были ограничены только регистрами данных, быстрого способа очистки регистра адресов не было. Вам нужно очистить регистр данных, а затем загрузить регистр данных в регистр адресов (два кода операции. Плох.).
Для выполнения последней операции, которая работает с любым регистром, требуется всего два байта, одно чтение памяти. В переводе на С вы получите
n = n - n;
, который будет работать для наиболее часто используемых типов n
(целое число или указатель).