Вопрос № 144120: Пусть A и B – два 8-разрядных регистра в обыкновенном 16-разрядном процессоре. Следующая процедура выполняет сдвиг регистра A на число разрядов, заданное в регистре B. Loop: SHR A ; shift right A DEC B ; decrement B JNZ Loop ; l...
Вопрос № 144.120
Пусть 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
уcпехов.
--------- Знания - сила
Ответ отправил: Евгений Иванов (статус: Профессор) Россия, Нижний Новгород Тел.: +79519145721 WWW:Eugene Ivanov ICQ: 214889076 ---- Ответ отправлен: 16.09.2008, 19:46
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Капранов Павел Павлович!
Ориентируемся на х86 процессор, и считаем такты процессора.
итого: 2+(2+5)*(В-1)+2+17 Легко заметить, что 2+2+17=2+3+16=21 Остается только то, что умножается на (В-1) т.е. (2+3+4) > (2+5). Второй цикл быстрее. Удачи!
--------- Итерация от человека, рекурсия — от Бога (Питер Дойч)
Ответ отправил: Зенченко Константин Николаевич (статус: Профессор) Украина, Киев Тел.: +380979536619 Адрес: Украина г.Киев ---- Ответ отправлен: 16.09.2008, 20:04
Отвечает: Trulala
;такты: ;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 = количество разрядов сдвига)