 |
Ассемблер в примерах - Быстрый сдвиг регистров
- Вопрос:
- Пусть A и B – два 8-разрядных регистра в обыкновенном 16-разрядном процессоре. Следующая процедура выполняет сдвиг регистра A на число разрядов, заданное в регистре B.
Loop:
SHR A ; shift right A
DEC B ; decrement B
JNZ Loop ; loop again
Напишите программу, которая выполняет сдвиг быстрее. Надо решить задачу без оператора многократного сдвига
- Ответ:
-
mov cl, [B]
mov ax, [A]
shr ax, cl
Другой вариант:
;такты:
;DEC reg = 3
;JZ = 16 при осущ. перехода; = 4 без осущ. перехода
;SHR reg,1 = 2
;
;к-во тактов при анализе значения BL = (n-1)*(время[DEC reg] + время[JZ no jump]) + (время[DEC reg] + время[JZ jump]) = (n-1)*(3+4) + (3+16)
;к-во тактов при выполнении сдвига = n*(время[SHR reg,1]) = n*2
;суммарные затраты = (n-1)*(3+4)+(3+16)+n*2 = (n-1)*7+19+n*2 = 7*n-7+19+2*n = 9*n+12
;при n=1 (9*n+12) = 21*n
;при n>1 (9*n+12) < 21*n
shr_AL PROC ;(AL = значение для сдвига, BL = количество разрядов сдвига)
dec bl
jz shr_al_1
dec bl
jz shr_al_2
dec bl
jz shr_al_3
dec bl
jz shr_al_4
dec bl
jz shr_al_5
dec bl
jz shr_al_6
dec bl
jz shr_al_7
dec bl
jz shr_al_8
ret
;3+16
shr_al_1:
shr al,1 ;2
ret
;1*(3+4)+(3+16)
shr_al_2:
shr al,1 ;2*2
shr al,1
ret
;2*(3+4)+(3+16)
shr_al_3:
shr al,1 ;2*3
shr al,1
sh r al,1
ret
;3*(3+4)+(3+16)
shr_al_4:
shr al,1 ;2*4
shr al,1
shr al,1
shr al,1
ret
;4*(3+4)+(3+16)
shr_al_5:
shr al,1 ;2*5
shr al,1
shr al,1
shr al,1
shr al,1
ret
;5*(3+4)+(3+16)
shr_al_6:
shr al,1 ;2*6
shr al,1
shr al,1
shr al,1
shr al,1
ret
;6*(3+4)+(3+16)
shr_al_7:
shr al,1 ;2*7
shr al,1
shr al,1
shr al,1
shr al,1
shr al,1
shr al,1
ret
;7*(3+4)+(3+16)
shr_al_8:
; shr al,1 ;2*8
; shr al,1
; shr al,1
; shr al,1
; shr al,1
; shr al,1
; shr al,1
; shr al,1
;при полном сдвиге получим 0
xor al,al ;3
ret
shr_AL ENDP
|  |