Из газеты Bugs #1, Великие Луки, 1999 ВОЗВЕДЕНИЕ В КВАДРАТ. Как вы догадались из названия статьи, речь здесь пойдет как раз о возведении в квадрат. Эта функция одна из наиболее простых в реализации на компьютере. Я предлагаю два варианта получения квадрата числа. 1. 8-БИТОВЫЙ ВАРИАНТ. HL = A ^ 2 LD H,128 ; 7 : 2 LD L,A ; 4 : 1 LD A,(HL) ; 7 : 1 INC H ; 4 : 1 LD H,(HL) ; 7 : 1 LD L,A ; 4 : 1 RET ; 10 : 1 ------------------------ 8 байт. Время = 43 такта. Видно, что используется таблица на 512 байт, в которую зара- нее помещены квадраты всех 256 чисел. Так сказать - ничего умнее я не придумал и не собираюсь. Опять таки напоминаю, что подпрог- рамму можно с-оптимизировать, если : а) Получать ответ не в HL. б) Число, которое возводится в квадрат - присылать в L. в) Избавиться от RET, внедрив подпрограмму в тело основной. г) Хранить число 128 еще где-нибудь. Пример для BC = L^2 : LD H,D ; 4 : 1 D = 128 LD C,(HL) ; 7 : 1 INC H ; 4 : 1 LD B,(HL) ; 7 : 1 ----------------------- 4 байта. Время = 22 такта. Да, чуть не забыл, для полноты картины привести процедуру созда- ния таблицы квадратов 8-битовых чисел. LD HL,32768 ; адрес начала таблицы LD D,L LD E,D LD B,D LD C,1 M1: LD (HL),E INC H LD (HL),D DEC H EX DE,HL ADD HL,BC EX DE,HL INC BC INC BC INC L JR NZ,M1 RET ------------------ 21 байт. Ну что, круто ? Как нет ?!? Ладно, а так : LD HL,32768 ; адрес начала таблицы LD D,L LD E,D LD B,D LD C,D M1: LD (HL),E INC H LD (HL),D DEC H INC BC EX DE,HL ADD HL,BC EX DE,HL INC BC INC L JR NZ,M1 RET ------------------ 20 байт. Что - опять лажа ? Согласен, можно короче - мой предел был 18 байт. 2. 16-БИТОВЫЙ ВАРИАНТ. Надо возвести в квадрат BC. Еще со школы всем нам (может и не всем) хорошо известно, что: ( A + B ) ^ 2 = A ^ 2 + 2 * A * B + B ^ 2 Так вот, если взять регистровую пару BC и разложить ее на 'A' и 'B' , то мы получим следующее : ( B*256 + L )^2. На этом и основано возведение в квадрат в моем варианте: A) Для начала создадим таблицу квадратов 8-БИТОВЫХ ЧИСЕЛ.(выше) Б) А теперь сама процедура: Принцип такой: DE:HL = BC ^ 2 LD H,128 LD L,C LD E,L LD A,(HL) LD (M1+1),A INC H LD C,(HL) LD L,B LD A,(HL) DEC H LD B,(HL) LD HX,A LD H,L LD D,0 LD L,D ; Теперь 8 раз следующие три строки - это умножение ! ADD HL,HL JR NC,$+3 ADD HL,DE ; ---------------------------------- LD D,HX ADD HL,HL JR NC,$+3 INC D ADD HL,BC LD E,H LD H,L M1: LD L,0 RET NC INC D RET ------------------- 66 байт. Время = примерно 400 тактов. Написано сходу и не оптимизировано. Так что дерзайте !!! А для начала попробуйте понять - что собственно произошло ?