Важная информация

User Tag List

Страница 1 из 8 12345 ... ПоследняяПоследняя
Показано с 1 по 10 из 79

Тема: Ассемблер. Первые шаги.

  1. #1
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,550
    Спасибо Благодарностей отдано 
    1,213
    Спасибо Благодарностей получено 
    1,748
    Поблагодарили
    680 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

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

    Сам же смысл индексной адресации, для которого они изначально и предназначались, несколько нивелирован громоздким мнемокодом и сравнительно медленным временем выполнения.

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

  3. #2
    Activist Аватар для Jukov
    Регистрация
    03.12.2005
    Адрес
    Серов
    Сообщений
    491
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    38
    Поблагодарили
    13 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Эти регисты очень ценны для обращения к переменным, особенно флагам. Преимуществом их перед другими способами обращения к переменным является то, что при этом не портятся другие регистры, например команда BIT 0,(IY+118) сразу выдает нам результат, а обычным способом это было бы:
    PUSH AF
    LD A,(23728)
    OR A
    ...
    POP AF

    А если флагов несколько, то они одновременно могут устанавливатся так, опять же без порчи других регистров:
    LD (IY+128),255
    Кворум-192, Кворум-128 CP/M, Кворум-64, ZS-Scorpion 256 Turbo+&Caro ZX_MC, Мастер48К

  4. #3
    Veteran
    Регистрация
    06.05.2006
    Адрес
    Ливны, Орловская обл
    Сообщений
    1,169
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    По своему небольшому опыту, обобщая, могу сказать что пользовал их как замену HL, когда сохранить/загрузить его выйдет дороже, как буфер для POP/PUSH, и половинки как счётчик для довольно большого цикла, когда других регистров нехватало.

  5. #4
    Member
    Регистрация
    02.02.2006
    Адрес
    Voronezh
    Сообщений
    94
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Можно обратить внимание на то, как используется IY обычным BASIC-48: как указатель на область своих переменных. Так как его переменные им часто используются, то имеем выигрыш в размере кода. Например, первое что приходит в голову - драйвер опроса клавиатуры, где уменьшаются счетчики задержек начала повтора/повтора символа. Это будет одной командой:

    Код:
    DEC (IY+xyz)
    JR NZ, ...
    Без индексных регистров (например, в i8080) было бы так:
    Код:
    LD A,(VAR)
    DEC A
    LD (VAR), A
    JR NZ,...
    в этом случае портится регистр A
    или
    Код:
    LD HL,VAR
    DEC (HL)
    JR NZ,...
    тогда портится регистровая пара HL.

  6. #5
    Member
    Регистрация
    27.01.2005
    Адрес
    С.-Петербург
    Сообщений
    93
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от mig'95 Посмотреть сообщение
    Никто не желает быть начинающим. Я буду первым
    А интересует меня практическая польза от использования индексных регистров IX и IY. Но интересует не столько теория (с ней я первично ознакомился благодаря книжке Инфоркома), сколько практика, т.е. в данном случае немного простеньких примеров, благодаря которым можно оценить их (IX и IY) преимущества.
    Компиляторы с языка C активно ими пользуются для указания на автоматические (выделенные в стеке) переменные. Преимущество в данном случае то - что экономится память для переменных (по сравнению со статически распределёнными), а также появляется возможность писать рекурсивные функции (естественно, следя за размером стека).

  7. #6
    Veteran Аватар для GriV
    Регистрация
    18.02.2005
    Адрес
    Набережные Челны
    Сообщений
    1,574
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Когда надо большой объём информации переправить, то очень эффективно используются IX и IY - но только как регистры данных (не как указатели). Для моих быстрых программ вывода звука и изображения - когда все регистры забиты предустановленными данными - я их использовал именно таким образом. Фактически, я не видел чтобы эти регистры использовали как указатели, прежде всего потому, что (как уже было сказано) слишком медленно оно работает и ограничение таблицы на 256 байт. Плюс невозможно косвенно (через другие регистры) адресовать смещение в таблице. Единственный раз я работал с структурами через IX и IY - это когда делал в своей View окошки - их дескрипторы передавались через IX, но не факт что так было быстрее - удобней, да.
    Очень часто я использовал половинки IX и IY для хранения каких то важных медленно меняющихся данных - например, номера текущей страницы. Т.е. оно быстрее чем память - адресуется напрямую - но медленнее чем обычные регистры.
    Длительность работы с половинками индексных регистров следующая:
    8 тактов для ld <index8>,<reg8>
    11 тактов для ld <index8>,N

    (4 такта для ld <reg8>,<reg8>
    7 тактов для ld <reg8>,N)

    Длительность для работы с целой парой:
    14 тактов для LD IX,NNNN
    20 тактов для LD (ADR),IX

    14 тактов POP IX
    15 тактов PUSH IX

    Фактически (кроме работы с памятью через смещение типа LD A,(IX+3)) команды отличаются наличием префиксов #DD и #FD, длительность каждого префикса 4 такта, вот и получается указанная математика (специально привёл для сравнения).
    Биты рулят лучше байтов, байты рулят шустрее!
    View, Звук, Цвет

  8. #7
    Banned Аватар для psndcj
    Регистрация
    22.02.2005
    Адрес
    triebkraft
    Сообщений
    712
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    в основном использую для переменных цикла в громоздких конструкциях с кучей вложенных циклов, либо как переменные, которые не часто изменяются. еще удобно иногда бывает использовать ix/iy для хранения/вычисления адреса перехода jp (ix)/(iy), если HL занят (как обычно и бывает).

  9. #8
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,254
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    34 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от mig'95 Посмотреть сообщение
    Я знаю - этот код ужасен, и именно по этой причине хочу услышать конструктивную критику.
    Легким движением руки превращается во что-то вроде (адаптировано под данную ситуацию, за точность не ручаюсь- могут быть глюки):

    Код:
            ORG 40000
    COUNT   LD A,0
            INC A
            AND 7
            LD (COUNT+1),A
            DEC A
            CALL Z,FILBF
    
    MAIN    LD HL,BUF1
            LD DE,BUF2
            LD B,08
    MET1 XOR A
            RL (HL)
            RLA
            LD (DE),A
            INC HL
            INC DE
            DJNZ MET1
    
            LD HL,471FH
            LD DE,BUF2+7
            LD B,08
    MET2    LD A,(DE)
            OR (HL)
            LD (HL),A
            DEC DE
            DEC H
            DJNZ MET2
            INC H
    
    SCRLIN
            LD B,08
    SCRL1
            LD L,#1F
            AND A
            DUP 31
            RL (HL)
            DEC L
            EDUP
            RL (HL)
            INC H
            DJNZ SCRL1
            RET
    
    FILBF   LD HL,MESS
            LD A,(HL)
            INC HL
            AND A
            JR NZ,NOSETM
            LD HL,MESS
    NOSETM
            LD (FILBF+1),HL
            ADD A,A
            ADD A,A
            ADD A,A
            LD L,A
            LD H,#3C
            LD DE,BUF1
            LD BC,08
            LDIR
            RET
    
    BUF1    DEFB 0,0,0,0,0,0,0,0
    BUF2    DEFB 0,0,0,0,0,0,0,0
    MESS    DEFB " Hello all members of zx.pk.ru!!!",0

  10. #9
    Banned Аватар для sinn_dtr
    Регистрация
    06.02.2005
    Адрес
    Barnaul
    Сообщений
    70
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Всегда избегал эти регистры из-за их тормознутости.

  11. #10
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,254
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    34 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Код:
    ...
    FILBF   LD HL,MESS
            LD A,(HL)
            INC HL
            AND A                ;тут, вроде, флаг Z сбрасывается, 
    ;если A==0, то Z=1
            JR NZ,NOSETM     ;след. условие NZ выполняется 
            LD HL,MESS         ;и сюда мы не попадаем никогда. Или нет?
    NOSETM
            LD (FILBF+1),HL   ;не понял ничего вплоть до RET :-)
    ;ошибочка тут:) должно быть так:
            LD L,A                
            ADD HL,HL           ;HL=sym*2+#xx00
            LD H,#0F             ;HL=sym*2+#f00
            ADD HL,HL           ;HL=sym*4+#1e00
            ADD HL,HL           ;HL=sym*8+#3c00  <- что и требовалось :)
            LD DE,BUF1          ;а здесь копируем
            LD BC,08
            LDIR
            RET
    ...
    Цитата Сообщение от mig'95 Посмотреть сообщение
    Я тут подумал, что можно было бы обойтись и без BUF2 выводя старший бит скроллируемого влево байта прямо на экран
    Можно и так. Еще у тебя есть ошибка- программу надо зациклить. Ну и добавить в цикле проверку на выход (клавишу там нажать надо или еще что).

Страница 1 из 8 12345 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. SjASMPlus Z80 кросс ассемблер
    от Aprisobal в разделе Программирование
    Ответов: 1663
    Последнее: 19.06.2021, 01:36
  2. Первые итоги
    от CityAceE в разделе Форум
    Ответов: 25
    Последнее: 15.07.2005, 08:03
  3. sjasm - первые глюки
    от breeze в разделе Программирование
    Ответов: 9
    Последнее: 24.03.2005, 10:51
  4. ZX ассемблер (и не только?) с библиотеками
    от shade в разделе Программирование
    Ответов: 24
    Последнее: 04.03.2005, 19:43

Ваши права

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