; Created by Napalm13 
; 28.03.2015
; Умножение чисел без учета знака, практикум по asm #3  

.include "m8def.inc"

.dseg ; Сегмент ОЗУ

.cseg ; Сегмент FLASH

; 1.Умножение однобайтных чисел
ldi r16, 255 ; Загружаем 1 множитель в r16
ldi r17, 255 ; Загружаем 2 множитель в r17
mul r16, r17 ; Результат в R1:R0
nop

; 2.Умножение двухбайтных чисел
clr r11 ; Очищаем r11 для дальнейшего использования его в качестве нуля
ldi r16, low(5666)  ; Загружаем младший байт 1 числа в r16
ldi r17, high(5666) ; Загружаем старший байт 1 числа в r17
ldi r18, low(12755)  ; Загружаем младший байт 2 числа в r18
ldi r19, high(12755) ; Загружаем старший байт 2 числа в r19

mul r18, r16 ; Умножаем младший байт 2 числа на младший байт 1 числа
mov r15, r0  ; Младший байт результата сразу идет в ответ - в 0 байт - r15
mov r2, r1   ; Копируем r1 (старший байт произведения) в r2 для сохранения промежуточного результата

mul r18, r17 ; Умножаем младший байт 2 числа на старший байт 1 числа
add r2, r0   ; Складываем младший байт произведения со старшим байтом предыдущего
adc r1, r11  ; Учитываем флаг переполнения С предыдущей операции
mov r3, r1   ; Копируем r1 в r3 для сохранения промежуточного результата

mul r19, r16 ; Умножаем старший байт 2 числа на младший байт 1 числа
mov r4, r0   ; Копируем r0 (младший байт произведения) в r4 для сохранения промежуточного результата
mov r5, r1   ; Копируем r1 (старший байт произведения) в r5 для сохранения промежуточного результата

mul r19, r17 ; Умножаем старший байт 2 числа на старший байт 1 числа
add r5, r0   ; Складываем младший байт произведения со старшим байтом предыдущего
adc r1, r11  ; Учитываем флаг переполнения С предыдущей операции
mov r6, r1   ; Копируем r1 (старший байт произведения) в r6 для сохранения промежуточного результата

add r2, r4 ; Складываем без учета флага С
adc r3, r5 ; Складываем с учетом флага С
adc r6, r11 ; Складываем с нулевым регистром для учета возможного флага С
; Ответ в r6:r3:r2:r15
nop


