User Tag List

Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 11 по 20 из 32

Тема: Квадратный корень на i8080

  1. #11

    Регистрация
    02.07.2010
    Адрес
    Запорожье
    Сообщений
    65
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    32-bit
    Код:
    ;=======================================================================
    ;   BC = SQRT(DEHL)
    ;-----------------------------------------------------------------------
    sqrt32:
    ;-----------------------------------------------------------------------
        mvi  a,30 + 2
        push psw  ; s+2
        lxi  b, 0 ; y
        push d    ; xh
        push h    ; xl
    ;-----------------------------------------------------------------------
    .loop:
        pop  h
        pop  d
        pop  psw
        sui  2  ; a=s
        rm
    ;-----------------------------------------------------------------------
        push psw
        push d
        push h
        mov  l,c
        mov  h,b
        dad  h
        mov  c,l
        mov  b,h ; BC=y=2*y
    ;-----------------------------------------------------------------------
        lxi  d,0
        dad  h
        inx  h   ; DEHL=b=2*y+1
    ;-----------------------------------------------------------------------
        inr  a
    .shift:
        dcr  a
        jz   .skip
        xchg
        dad  h
        jc   .loop
        xchg
        dad  h
        jnc  .shift
        inx  d
        jmp  .shift    
    .skip:        ; DEHL << A=s
    ;-----------------------------------------------------------------------
        push d
        push h
        lxi  h,4
        dad  sp
        xchg    ; DE --> X
        lxi  h,0
        dad  sp ; HL --> B
    ;-----------------------------------------------------------------------
        ldax d
        sub  m
        mov  m,a
        inx  h
        inx  d
        ldax d
        sbb  m
        mov  m,a
        inx  h
        inx  d
        ldax d
        sbb  m
        mov  m,a
        inx  h
        inx  d
        ldax d
        sbb  m
        mov  m,a
    ;-----------------------------------------------------------------------
        pop  h
        pop  d
        jc   .loop
    ;-----------------------------------------------------------------------
        xthl
        pop  h
        xchg
        xthl
        push d
        inx  b
        jmp  .loop    
    ;=======================================================================
    можно и посмотреть: SQRT32.rks.7z
    Последний раз редактировалось shoorick; 04.08.2016 в 17:51. Причина: DEHL != CONST

  2. #12

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,386
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,365
    Поблагодарили
    1,315 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вариант b2ma удачно сочетает компактность и скорость. Если добавить 3 байта, то будет на 15% быстрее. Но если действительно нужно много и быстро (почти в 3 раза быстрее) считать квадратные корни, то пригодится вариант с таблицей (перевел с z80 отсюда).
    Последний раз редактировалось ivagor; 14.08.2016 в 17:07.

  3. #13

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,386
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,365
    Поблагодарили
    1,315 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Немного сокращенная и ускоренная версия табличного варианта (предыдущий убрал)
    Вложения Вложения

  4. #14

    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,926
    Спасибо Благодарностей отдано 
    105
    Спасибо Благодарностей получено 
    290
    Поблагодарили
    216 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Если добавить 3 байта, то будет на 15% быстрее.
    Ну ты как всегда, в своём репертуаре
    Колись уже, где там 3 байта добавлять надо.

  5. #15
    HardWareMan
    Гость

    По умолчанию

    Вконце, 3 NOPа после RET.

  6. #16

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,386
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,365
    Поблагодарили
    1,315 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну я действительно в своем репертуаре - всего лишь избавился от процедуры
    Вложения Вложения

  7. #16
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #17
    HardWareMan
    Гость

    По умолчанию

    А действительно.
    Код:
    0001   0000             ; вход: HL - квадрат числа
    0002   0000             ; выход: B - число
    0003   0000             ; DE - разница между исходным числом и квадратом
    0004   0000 01 08 00    SQRT:	LXI B,8
    0005   0003 11 00 00    	LXI D,0
    0006   0006 CD 22 00    SQRT1:	CALL SHFT
    0007   0009 CD 22 00    	CALL SHFT
    0008   000C E5          	PUSH H
    0009   000D 78          	MOV A,B
    0010   000E 87          	ADD A
    0011   000F 47          	MOV B,A
    0012   0010 2F          	CMA
    0013   0011 6F          	MOV L,A
    0014   0012 26 FF       	MVI H,0FFh
    0015   0014 29          	DAD H
    0016   0015 23          	INX H
    0017   0016 19          	DAD D
    0018   0017 D2 1C 00    	JNC SQRT2
    0019   001A 04          	INR B
    0020   001B EB          	XCHG
    0021   001C E1          SQRT2:	POP H
    0022   001D 0D                  DCR C
    0023   001E C2 06 00    	JNZ SQRT1
    0024   0021 C9          	RET
    0025   0022             ;
    0026   0022 EB          SHFT:	XCHG
    0027   0023 29          	DAD H
    0028   0024 EB          	XCHG
    0029   0025 29          	DAD H
    0030   0026 D0          	RNC
    0031   0027 13          	INX D
    0032   0028 C9          	RET
    Против:
    Код:
    0001   0000             ; вход: HL - квадрат числа
    0002   0000             ; выход: B - число
    0003   0000             ; DE - разница между исходным числом и квадратом
    0004   0000 01 08 00    SQRT:	LXI B,8
    0005   0003 11 00 00    	LXI D,0
    0006   0006 EB          SQRT1:	XCHG
    0007   0007 29          	DAD H
    0008   0008 EB          	XCHG
    0009   0009 29          	DAD H
    0010   000A D2 0E 00    	JNC SQRT11
    0011   000D 13          	INX D
    0012   000E EB          SQRT11: XCHG
    0013   000F 29          	DAD H
    0014   0010 EB          	XCHG
    0015   0011 29          	DAD H
    0016   0012 D2 16 00    	JNC SQRT12
    0017   0015 13          	INX D
    0018   0016 E5          SQRT12:	PUSH H
    0019   0017 78          	MOV A,B
    0020   0018 87          	ADD A
    0021   0019 47          	MOV B,A
    0022   001A 2F          	CMA
    0023   001B 6F          	MOV L,A
    0024   001C 26 FF       	MVI H,0FFh
    0025   001E 29          	DAD H
    0026   001F 23          	INX H
    0027   0020 19          	DAD D
    0028   0021 D2 26 00    	JNC SQRT2
    0029   0024 04          	INR B
    0030   0025 EB          	XCHG
    0031   0026 E1          SQRT2:	POP H
    0032   0027 0D                  DCR C
    0033   0028 C2 06 00    	JNZ SQRT1
    0034   002B C9          	RET

  9. #18

    Регистрация
    02.07.2010
    Адрес
    Запорожье
    Сообщений
    65
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    т.е. табличный быстрее, просто жрет OVER 512 байт памяти.

    что касается отдельной процедуры сдвига: скорость - это да, минус вызов и возврат,
    но по объему вряд ли, в сложной программе такой сдвиг будет востребован неоднократно в разных местах,
    поэтому в процедурке есть смысл.

    думаю, оптимальный вариант будет зависить от конкретных условий гдавное, есть из чего выбирать

  10. #19

    Регистрация
    03.03.2008
    Адрес
    Петербург
    Сообщений
    279
    Спасибо Благодарностей отдано 
    69
    Спасибо Благодарностей получено 
    22
    Поблагодарили
    16 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от shoorick Посмотреть сообщение
    Использует подпрограмму деления Д32А из книжки Гуртовцева и Гудыменко
    Цитата Сообщение от shoorick Посмотреть сообщение
    портировал данный код из другой известной книжки
    shoorick, из какой "другой известной книжки"?

  11. #20

    Регистрация
    02.07.2010
    Адрес
    Запорожье
    Сообщений
    65
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Hacker's Delight (по-нашему: Алгоритмические трюки для программистов)

Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. PMI-80 - одноплатник на i8080
    от rw6hrm в разделе Разное
    Ответов: 72
    Последнее: 02.09.2022, 12:27
  2. Совместимость Z80 и i8080 (580ВМ80)
    от Dmitry Dubrovenko в разделе Для начинающих
    Ответов: 50
    Последнее: 08.05.2016, 09:54
  3. Код эмуляции i8080 на С
    от medvdv в разделе Эмуляторы отечественных компьютеров
    Ответов: 15
    Последнее: 27.03.2015, 03:43
  4. Квадратный корень
    от Destr в разделе Программирование
    Ответов: 29
    Последнее: 25.03.2012, 11:14
  5. Эмулятор i8080
    от Higgins в разделе Разное
    Ответов: 2
    Последнее: 20.05.2011, 11:43

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •