Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Быстрый сдвиг регистров

Вопрос:
Пусть 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


   Вперёд
   Содержание