История изменений
Исправление KivApple, (текущая версия) :
Таким образом можно складывать числа произвольной разрядности, хоть 256-битные. При этом зависимость количества инструкций от разрядности будет линейная (разве что не хватит регистров, чтобы загрузить всё число и придётся делать подгрузку-сохранение на промежуточных этапах). Этот код работал бы даже на самых первых x86, которые появились когда 32-битности ещё и в проекте не было. Как и микрокода.
Всё просто. Команда сложения add в случае переполнения взводит специальный флаг (по сути дела просто сложение выполняется не 16-битное, а 17-битное, но старший бит уходит во флаг). А команда сложения adc делает то же самое, но прибавляет к результату старое значение флага (если было переполнение, то результат будет на единицу больше, если не было, то таким же как и после обычного сложения). Аналогичные команды есть практически на любой архитектуре, включая многие RISC. И AVR не исключение.
«Всё гениальное - просто» (с)
Исправление KivApple, :
Таким образом можно складывать числа произвольной разрядности, хоть 256-битные. При этом зависимость количества инструкций от разрядности будет линейная (разве что не хватит регистров, чтобы загрузить всё число и придётся делать подгрузку-сохранение на промежуточных этапах). Этот код работал бы даже на самых первых x86, которые появились когда 32-битности ещё и в проекте не было. Как и микрокода.
Всё просто. Команда сложения add в случае переполнения взводит специальный флаг (по сути дела просто сложение выполняется не 16-битное, а 17-битное, но старший бит уходит во флаг). А команда сложения adc делает то же самое, но прибавляет к результату старое значение флага (если было переполнение, то результат будет на единицу больше, если не было, то таким же как и после обычного сложения). Аналогичные команды есть практически на любой архитектуре, включая многие RISC. И AVR не исключение.
Исправление KivApple, :
Таким образом можно складывать числа произвольной разрядности, хоть 256-битные. При этом зависимость количества инструкций от разрядности будет линейная (разве что не хватит регистров, чтобы загрузить всё число и придётся делать подгрузку-сохранение на промежуточных этапах). Этот код работал бы даже на самых первых x86, которые появились когда 32-битности ещё и в проекте не было. Как и микрокода.
Всё просто. Команда сложения add в случае переполнения взводит специальный флаг (по сути дела просто сложения выполняется не 16-битное, а 17-битное, но старший бит уходит во флаг). А команда сложения adc делает то же самое, но прибавляет к результату старое значение флага (если было переполнение, то результат будет на единицу больше, если не было, то таким же как и после обычного сложения). Аналогичные команды есть практически на любой архитектуре, включая многие RISC. И AVR не исключение.
Исправление KivApple, :
Таким образом можно складывать числа произвольной разрядности, хоть 256-битные. При этом зависимость количества инструкций от разрядности будет линейная (разве что не хватит регистров, чтобы загрузить всё число и придётся делать подгрузку-сохранение на промежуточных этапах). Этот код работал бы даже на самых первых x86, которые появились когда 32-битности ещё и в проекте не было. Как и микрокода.
Всё просто. Команда сложения add в случае переполнения взводит специальный флаг. А команда сложения adc делает то же самое, но прибавляет к результату старое значение флага (если было переполнение, то результат будет на единицу больше, если не было, то таким же как и после обычного сложения). Аналогичные команды есть практически на любой архитектуре, включая многие RISC. И AVR не исключение.
Исходная версия KivApple, :
Таким образом можно складывать числа произвольной разрядности, хоть 256-битные. При этом зависимость количества инструкций от разрядности будет линейная. Этот код работал бы даже на самых первых x86, которые появились когда 32-битности ещё и в проекте не было. Как и микрокода.
Всё просто. Команда сложения add в случае переполнения взводит специальный флаг. А команда сложения adc делает то же самое, но прибавляет к результату старое значение флага (если было переполнение, то результат будет на единицу больше, если не было, то таким же как и после обычного сложения). Аналогичные команды есть практически на любой архитектуре, включая многие RISC. И AVR не исключение.