Данная библиотека арифметических функций составлена Сергеем Вакуленко по материалам сайта Ангстрем http://www.angstrem.ru/product/risc.htm.
Беззнаковое умножение 8×8
movl %a0,0Fh ; Исходные... movl %a1,0Fh ; ...данные jsr mul8u ; Вызов рабочей подпрограммы
Знаковое умножение 8×8
movl %a0,0Fh ; Исходные... movl %a1,0Fh ; ...данные jsr mul8s ; Вызов рабочей подпрограммы
Беззнаковое умножение 16×16
movl %a0,0Fh ; Исходные... movl %a1,0Fh ; ...данные movl %a2,0Fh ; Исходные... movl %a3,0Fh ; ...данные jsr mul16u ; Вызов рабочей подпрограммы
Знаковое умножение 16×16
movl %a0,0Fh ; Исходные... movl %a1,0Fh ; ...данные movl %a2,0Fh ; Исходные... movl %a3,0Fh ; ...данные jsr mul16s ; Вызов рабочей подпрограммы
Беззнаковое деление 8×8
movl %a0,0Fh ; Исходные... movl %a1,02h ; ...данные jsr div8u ; Вызов рабочей подпрограммы
Знаковое деление 8×8
movl %a0,0Fh ; Исходные... movl %a1,02h ; ...данные jsr div8s ; Вызов рабочей подпрограммы
Беззнаковое деление 16×16
movl %a0,0Fh ; Исходные... movl %a1,03h ; ...данные movl %a2,03h ; Исходные... movl %a3,00h ; ...данные jsr div16u ; Вызов рабочей подпрограммы
Вход:
Выход:
Используется:
mul8u: xor %a2, %a2 ; Инициализация ст. байта результата и CF movl %a3, 9 ; Число битов в байте + 1 jmp $4f ; На нулевой сдвиг 2-го множителя $2: add %a2, %a0 ; Сложение ст. байта результата с 1-ым множителем $3: rrc %a2 ; Циклич. сдвиг вправо ст. байта результата $4: rrc %a1 ; Циклич. сдвиг вправо мл. байта результата и 2-го множителя jc $5f ; Если CF=1 dec %a3 ; Пока не все jnz $3b ; сдвиги rts ; Выход из подпрограммы $5: dec %a3 ; Пока не все sst 1 ; CF=1 jnz $2b ; сдвиги rts ; Выход из подпрограммы
Вход:
Выход:
Используется:
mul8s: xor %a2, %a2 ; Инициализация ст. байта результата и CF movl %a3, 8 ; Число битов в байте jmp $3f ; На битовую проверку $2: add %a2, %a0 ; Сложение ст. байта результата с 1-ым множителем $3: bttl %a1, 0001b ; Установлен бит 0 в мл. байте результата и 2-го множителе? jz .+1 ; Нет sub %a2, %a0 ; Восстановление ст. байта результата shra %a2 ; Арифметич. сдвиг вправо ст. байта результата rrc %a1 ; Циклич. сдвиг вправо мл. байта результата и 2-го множителя jc $5f ; Если CF=1 dec %a3 ; Пока не все jnz $3b ; сдвиги rts ; Выход из подпрограммы $5: dec %a3 ; Пока не все sst 1 ; CF=1 jnz $2b ; сдвиги rts ; Выход из подпрограммы
Вход:
Выход:
Используется:
mul16u: clr %a5 ; Инициализация байта 3 результата xor %a4, %a4 ; Инициализация байта 2 результата и CF movl %a6, 17 ; Число битов в байте + 1 jmp $4f ; На нулевой сдвиг 2-го множителя $2: add %a4, %a0 ; Сложение байта 2 результата с мл. байтом 1-го множителя adc %a5 ; Сложение байта 3 результата с CF jnc $100f ; Если не установлен CF add %a5, %a1 ; Сложение байта 3 результата с ст. байтом 1-го множителя sst 1 ; Восстановление jmp $3f ; CF $100: add %a5, %a1 ; Сложение байта 3 результата с ст. байтом 1-го множителя $3: rrc %a5 ; Циклич. сдвиг вправо байта 3 результата rrc %a4 ; Циклич. сдвиг вправо байта 2 результата $4: rrc %a3 ; Циклич. сдвиг вправо байта 1 результата и мл.б. 2 множителя rrc %a2 ; Циклич. сдвиг вправо байта 0 результата и ст.б. 2 множителя jc $5f ; Если CF=1 dec %a6 ; Пока не все jnz $3b ; сдвиги rts ; Выход из подпрограммы $5: dec %a6 ; Пока не все sst 1 ; CF=1 jnz $2b ; сдвиги rts ; Выход из подпрограммы
Вход:
Выход:
Используется:
Недоделано - пока оставляю эту п/программу, займусь лучше следующими
mul16s: clr %a5 ; Инициализация байта 3 результата xor %a4, %a4 ; Инициализация байта 2 результата и CF movl %a6, 16 ; Число битов в байте $1: JNC $3f $2: add %a4, %a0 ; Сложение байта 2 результата с мл. байтом 1-го множителя adc %a5 ; Сложение байта 3 результата с CF jnc $100f ; Если не установлен CF add %a5, %a1 ; Сложение байта 3 результата с ст. байтом 1-го множителя sst 1 ; Восстановление jmp $3f ; CF $100: add %a5, %a1 ; Сложение байта 3 результата с ст. байтом 1-го множителя $3: jsr RBTTL jz .+1 ; Нет sub %a4, %a0 ; Восстановление байта 2 результата jsr RBTTL jz $4f ; Нет sbc %a5 ; Восстановление jnc $200f ; Если не установлен CF sub %a5, %a1 ; байта 3 результата sst 1 ; Восстановление jmp $4f ; CF $200: sub %a5, %a1 ; байта 3 результата $4: shra %a5 ; Арифметич.сдвиг вправо байта 3 результата rrc %a4 ; Циклич. сдвиг вправо байта 2 результата rrc %a3 ; Циклич. сдвиг вправо байта 1 результата и мл.б. 2 множителя rrc %a2 ; Циклич. сдвиг вправо байта 0 результата и ст.б. 2 множителя JSR RDEC ; {Это} jnz $1b ; {всё} rts ; {временно} ;??? jc $5f ; Если CF=1 dec %a6 ; Пока не все jnz $3b ; сдвиги rts ; Выход из подпрограммы $5: dec %a6 ; Пока не все sst 1 ; CF=1 jnz $2b ; сдвиги rts ; Выход из подпрограммы ; ; П/программки для сохранения бита C ; RDEC: jc $1f dec %a6 rts $1: dec %a6 sst 1 rts RBTTL: jc $1f bttl %a2, 0001b rts $1: bttl %a2, 0001b sst 1 rts ;RBTTH: jc $1f ; btth %a4, 1000b ; rts ;$1: btth %a4, 1000b ; sst 1 ; rts ; ;CBTTH1: ; jc .+2 ; btth %a1, 1000b ; rts ; btth %a1, 1000b ; sst 1 ; rts
Вход:
Выход:
Используется:
div8u: xor %a2, %a2 ; Инициализация остатка и CF movl %a3, 9 ; Число битов в байте + 1 $1: rlc %a0 ; Циклич. сдвиг влево делимого и частного jc $4f ; Если CF=1 dec %a3 ; Пока не все jnz $2f ; сдвиги rts ; Выход из подпрограммы $4: dec %a3 ; Пока не все sst 1 ; CF=1 jnz $2f ; сдвиги rts ; Выход из подпрограммы $2: rlc %a2 ; Циклич. сдвиг влево остатка sub %a2, %a1 ; Вычитание из остатка делителя jnc $3f ; Если разность >0 add %a2, %a1 ; Иначе - восстанавливается остаток cst 1 ; CF=0 jmp $1b ; Следующий цикл $3: sst 1 ; CF=1 jmp $1b ; Следующий цикл
Вход:
Выход:
Используется:
div8s: mov %a4, %a0 ; Делимое - в знаковый регистр xor %a4, %a1 ; XOR знакового регистра с делителем btth %a1, 1000b ; Делитель <0? jz .+1 ; Нет neg %a1 ; Смена знака делителя btth %a0, 1000b ; Делимое <0? jz .+1 ; Нет neg %a0 ; Смена знака делимого clr %a2 ; Инициализация остатка movl %a3, 9 ; Число битов в байте + 1 $1: rlc %a0 ; Циклич. сдвиг влево делимого и частного jc $4f ; Если CF=1 dec %a3 ; Пока не все jnz $2f ; сдвиги jmp $5f ; $4: dec %a3 ; Пока не все sst 1 ; CF=1 jnz $2f ; сдвиги $5: btth %a4, 1000b ; Знаковый регистр <0? jz .+1 ; Нет neg %a0 ; Смена знака знакового регистра rts ; Выход из подпрограммы $2: rlc %a2 ; Циклич. сдвиг влево остатка sub %a2, %a1 ; Вычитание из остатка делителя jnc $3f ; Если разность >0 add %a2, %a1 ; Иначе - восстанавливается остаток cst 1 ; CF=0 jmp $1b ; Следующий цикл $3: sst 1 ; CF=1 jmp $1b ; Следующий цикл
Вход:
Выход:
Используется:
div16u: clr %a4 ; Инициализация мл. байта остатка xor %a5, %a5 ; Инициализация ст. байта остатка и CF movl %a6, 17 ; Число битов в байте + 1 $1: rlc %a0 ; Циклич. сдвиг влево мл.б. делимого и мл.б. частного rlc %a1 ; Циклич. сдвиг влево ст.б. делимого и ст.б. частного jc $4f ; Если CF=1 dec %a6 ; Пока не все jnz $2f ; сдвиги rts ; Выход из подпрограммы $4: dec %a6 ; Пока не все sst 1 ; CF=1 jnz $2f ; сдвиги rts ; Выход из подпрограммы $2: rlc %a4 ; Циклич. сдвиг влево мл. байта остатка rlc %a5 ; Циклич. сдвиг влево ст. байта остатка sub %a4, %a2 ; Вычитание из мл.б. остатка мл.б. делителя sbc %a5 ; Вычитание из ст.б. остатка CF jc $5f ; Если разность <0 sub %a5, %a3 ; Вычитание из ст.б. остатка ст.б. делителя jnc $3f ; Если разность >0 add %a4, %a2 ; Иначе - adc %a5 ; восстанавливается add %a5, %a3 ; остаток cst 1 ; CF=0 jmp $1b ; Следующий цикл $3: sst 1 ; CF=1 jmp $1b ; Следующий цикл $5: add %a4, %a2 ; Восстанавливается adc %a5 ; остаток cst 1 ; CF=0 jmp $1b ; Следующий цикл