как умножить 16-ти разрядное число на 8 ми битное число?
Добавлено: Вт июн 03, 2014 13:53:13
в моем случае необходимо умножить регистровую пару на 196, на ассемблере, помогите 
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Код: Выделить всё
;r16, r17 - исходное число
;r16, r17, r18 - результат
;r19, r20, r21 - временные регистры
mul16_196:
push r19
push r20
push r21
;сохраняем исходное значение
push r16
push r17
;берем для расчетов исходное число
clr r19
mov r20, r16
mov r21, r17
;умножение на 256 / вместо сдвига на 8, сдвигаем байты
mov r18, r17
mov r17, r16
clr r16
;умножение на 64 / вместо сдвига влево на 6, сдвиг вправо на 2
lsr r21
ror r20
ror r19
lsr r21
ror r20
ror r19
;вычитание (x*256 - x*64)
sub r16, r19
sbc r17, r20
sbc r18, r21
;восстанавливаем исходное значение
clr r21
pop r20
pop r19
;умножение на 4 / сдвиг влево на 2
lsl r19
rol r20
rol r21
lsl r19
rol r20
rol r21
;сложение (x*256 - x*64) + x*4
add r16, r19
adc r17, r20
adc r18, r21
pop r21
pop r20
pop r19
ret
Код: Выделить всё
MULT:
;XH:XL - исходное число
;YH,YL,R17 - временные регистры
;XH:XL:R16 - результат
PUSH R17 ;сохраняем регистры...
PUSH YH
PUSH YL
CLR R16 ;умножаем на 128
LSR XH
ROR XL
ROR R16
MOV YL,R16 ;сохраняем промежуточный результат
MOV YH,XL
MOV R17,XH
LSR R17 ;делим на 2
ROR YH
ROR YL
ADD R16,YL ;результат (х*64) складываем с (х*128)
ADC XL,YH
ADC XH,R17
LSR R17 ;делим еще на 16
ROR YH
ROR YL
LSR R17
ROR YH
ROR YL
LSR R17
ROR YH
ROR YL
LSR R17 ;получаем x*4
ROR YH
ROR YL
ADD R16,YL ;складываем с результатом
ADC XL,YH ;итого х=х*128+х*64+х*4
ADC XH,R17
POP YL ;восстанавливаем регистры, если надо...
POP YH
POP R17 ;34 команды @ 40 тактов
RET
Код: Выделить всё
MULT:
;XH:XL - исходное число
;R16,R17,R0 - временные регистры
;R1:XH:XL - результат
PUSH R0
PUSH R16
PUSH R17
MOV R17,XH
LDI R16,196
MUL XL,R16 ;умножаем столбиком младший байт на 196
MOVW XL,R0
MUL R17,R16 ;и старший
ADD XH,R0 ;суммируем, получаем результат
CLR R0
ADC R1,R0
POP R17
POP R16
POP R0
RET