LINUX.ORG.RU

История изменений

Исправление KivApple, (текущая версия) :

Сказано же тебе - сумматор просто на 1 бит больше, чем надо. И лишний бит после операции уходит в регистр флагов. И есть специальная инструкция, которая складывает сразу 3 числа - аргументы, которые указал программист и однобитный регистр флагов. Такой набор инструкций - стандарт де факто для всех архитектур. И да, если открыть в даташите страницу про набор инструкций, то там прямо первыми в списке идут ADD и ADC, которые делают ровно то же самое, что и соответствующие инструкции на x86, только размеры операндов у них 8 бит, а не 16 (а значит для сложения 32-битных чисел потребуется 4 инструкции вместо 2, а для сложения 16-битных 2 вместо одной). Аналогичная ситуация для функций вычитания - точно также как на x86, на AVR есть команды вычитания, которые учитывают результат прошлой операции (если мы вычитаем из меньшего большего взводится специальный флаг).

Кстати, если прокрутить список инструкций дальше, можно увидеть, что команда умножения принимает значения из одиночных регистров, а пишет результат в пару регистров. То есть умножение 8-битных чисел всегда даёт 16-битное число. На x86 абсолютно такая же ситуация - результат умножения всегда в 2 раза шире аргументов (а делимое всегда в 2 раза шире делителя и частного, но на AVR нет аппаратного деления). И тут всё получается опять же банально. Бежим по байтикам числа и умножаем их по отдельности и складываем каждый со старшим байтом результата умножения предыдущего (разумеется, складываем с помощью ADC).

Только вот если ты такой умный, что споришь со мною, а не веришь мне на слово - почему ты сам не загуглил?

Кстати, угадай сколько команд занимает установка/снятие бита в числе?

Исправление KivApple, :

Сказано же тебе - сумматор просто на 1 бит больше, чем надо. И лишний бит после операции уходит в регистр флагов. И есть специальная инструкция, которая складывает сразу 3 числа - аргументы, которые указал программист и однобитный регистр флагов. Такой набор инструкций - стандарт де факто для всех архитектур. И да, если открыть в даташите страницу про набор инструкций, то там прямо первыми в списке идут ADD и ADC, которые делают ровно то же самое, что и соответствующие инструкции на x86, только размеры операндов у них 8 бит, а не 16 (а значит для сложения 32-битных чисел потребуется 4 инструкции вместо 2, а для сложения 16-битных 2 вместо одной). Аналогичная ситуация для функций вычитания - точно также как на x86, на AVR есть команды вычитания, которые учитывают результат прошлой операции (если мы вычитаем из меньшего большего взводится специальный флаг).

Кстати, если прокрутить список инструкций дальше, можно увидеть, что команда умножения принимает значения из одиночных регистров, а пишет результат в пару регистров. То есть умножение 8-битных чисел всегда даёт 16-битное число. На x86 абсолютно такая же ситуация - результат умножения всегда в 2 раза шире аргументов (а делимое всегда в 2 раза шире делителя и частного, но на AVR нет аппаратного деления). И тут всё получается опять же банально. Бежим по байтикам числа и умножаем их по отдельности и складываем каждый со старшим байтом результата умножения предыдущего (разумеется, складываем с помощью ADC).

Только вот если ты такой умный, что споришь со мною, а не веришь мне на слово - почему ты сам не загуглил?

Исправление KivApple, :

Сказано же тебе - сумматор просто на 1 бит больше, чем надо. И лишний бит после операции уходит в регистр флагов. И есть специальная инструкция, которая складывает сразу 3 числа - аргументы, которые указал программист и однобитный регистр флагов. Такой набор инструкций - стандарт де факто для всех архитектур. И да, если открыть в даташите страницу про набор инструкций, то там прямо первыми в списке идут ADD и ADC, которые делают ровно то же самое, что и соответствующие инструкции на x86, только размеры операндов у них 8 бит, а не 16 (а значит для сложения 32-битных чисел потребуется 4 инструкции вместо 2, а для сложения 16-битных 2 вместо одной). Аналогичная ситуация для функций вычитания - точно также как на x86, на AVR есть команды вычитания, которые учитывают результат прошлой операции (если мы вычитаем из меньшего большего взводится специальный флаг).

Кстати, если прокрутить список инструкций дальше, можно увидеть, что команда умножения принимает значения из одиночных регистров, а пишет результат в пару регистров. То есть умножение 8-битных чисел всегда даёт 16-битное число. На x86 абсолютно такая же ситуация - результат умножения всегда в 2 раза шире аргументов (а делимое всегда в 2 раза шире делителя и частного, но на AVR нет аппаратного деления). И тут всё получается опять же банально. Бежим по байтикам числа и умножаем их по отдельности и складываем каждый со старшим байтом результата умножения предыдущего (разумеется, складываем с помощью ADC).

Исходная версия KivApple, :

Сказано же тебе - сумматор просто на 1 бит больше, чем надо. И лишний бит после операции уходит в регистр флагов. И есть специальная инструкция, которая складывает сразу 3 числа - аргументы, которые указал программист и однобитный регистр флагов. Такой набор инструкций - стандарт де факто для всех архитектур. И да, если открыть в даташите страницу про набор инструкций, то там прямо первыми в списке идут ADD и ADC, которые делают ровно то же самое, что и соответствующие инструкции на x86, только размеры операндов у них 8 бит, а не 16 (а значит для сложения 32-битных чисел потребуется 4 инструкции вместо 2, а для сложения 16-битных 2 вместо одной). Аналогичная ситуация для функций вычитания - точно также как на x86, на AVR есть функции вычитания, которые учитывают результат прошлой операции (если мы вычитаем из меньшего большего взводится специальный флаг).

Кстати, если прокрутить список инструкций дальше, можно увидеть, что функция умножения принимает значения из одиночных регистров, а пишет результат в пару регистров. То есть умножение 8-битных чисел всегда даёт 16-битное число. На x86 абсолютно такая же ситуация - результат умножения всегда в 2 раза шире аргументов (а делимое всегда в 2 раза шире делителя и частного, но на AVR нет аппаратного деления). И тут всё получается опять же банально. Бежим по байтикам числа и умножаем их по отдельности и складываем каждый со старшим байтом результата умножения предыдущего (разумеется, складываем с помощью ADC).