User Tag List

Страница 5 из 28 ПерваяПервая 123456789 ... ПоследняяПоследняя
Показано с 41 по 50 из 276

Тема: Практическое программирование в среде RT-11 на ассемблере.

  1. #41

    Регистрация
    10.06.2016
    Адрес
    г. Киев, Украина
    Сообщений
    87
    Спасибо Благодарностей отдано 
    30
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    9 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В MIPS 20-летней и более давности, например. Борьба со сбросом конвеера при переходе.

  2. #42

    Регистрация
    27.05.2009
    Адрес
    СССР, Новосибирск
    Сообщений
    5,850
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    289
    Поблагодарили
    233 сообщений
    Mentioned
    30 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от kolk Посмотреть сообщение
    А думанье в командах "пропустить, если" (условные команды позволяют только пропустить следующую) и "отложенный переход" (следующая команда после команды перехода выполняется до перехода) привычно?
    Да нет, привычнее когда с одним регистром можно только вот так поступать, с другим эдак, а на третий - табу - его нельзя трогать, ну а память-память в одной операции - ни-ни!
    Ну а уж чтобы один и тот же код имел разный функционал - это вообще святое!
    Последний раз редактировалось form; 03.12.2016 в 22:24.
    PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
    Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
    PMI: KDJ11-BF, MSV11-JE
    VT220, CM7209

  3. #43

    Регистрация
    02.03.2015
    Адрес
    г. Караганда, Казахстан
    Сообщений
    2,321
    Спасибо Благодарностей отдано 
    35
    Спасибо Благодарностей получено 
    225
    Поблагодарили
    177 сообщений
    Mentioned
    17 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Ааа) PC же перескакивает команду SEC автоинкрементом)
    Ну, PDP-шники, вы извращенцы) А такие методы адресации этому лишь способствуют)
    Для понятности можно написать по=другому
    Код:
           TST   #261
    ERRXIT = .-2
           RTS   PC
    (ERRor eXIT - выход по ошибке, временная метка тут как-то не очень, если не делать .ENABLE LSB, то она почти наверняка окажется недоступной, ибо стандартная область действия временных меток - между двумя постоянными.)

    - - - Добавлено - - -

    А вот прием для обслуживания кучи одинаковых устройств. Пример - несколько терминалов, подключенных через обычные ВП1-065, допустим, на плате КТЛК-6. Программу обслуживания их прерываний (код), обычно, пользуют одну и ту же, а переменные данные (кольцевые буферы и текущие адреса в них, всякие счетчики, флажки и пр.) располагают в таблице, для каждого терминала - своей. В этом случае программа обслуживания конкретного прерывания от терминала должна поместить в какой-то заданный регистр адрес этой таблицы, перед этим сохранив его, и уйти на общую программу обслуживания прерывания от терминалов. Так вот, можно воспользоваться следующим приемом, допустим, адрес таблицы нужен в R0 (подсмотрено в ядре ДИАМСа.):

    Код:
    INTn:   JSR   R0,@(PC)+    ; смещение -4 от начала таблицы. Команда.
            .WORD TRMINT       ; Смещение -2 от начала таблицы. Адрес общей программы обслуживания 
                               ; прерываний от терминала.
    nTABLE:                    ; Собственно таблица, ее начало
            .........
    Вектора же заполняем указателями на команду JSR R0,@(PC)+, то есть на смещение -4 от начала таблицы, каждому терминалу - своей. Таким образом, прерывание от терминала этой командой сохранит R0 в стеке, поместит в этот R0 адрес начала таблицы и уйдет на общую программу обслуживания терминалов.

    Обычно эти таблицы генерятся динамически в занятом для них куске свободной памяти при запуске программы. При этом сначала берут адрес этого участка памяти для таблицы, записывают его в вектор конкретного терминала, потом в память по этому адресу пересылают с автоинкрементом сначала код 4037 (тот самый JSR), затем адрес программы обслуживания терминалов, получившийся после этих двух пересылок адрес сохраняем в качестве адреса начала таблицы для этого терминала, после чего генерим собственно таблицу в ее начальном состоянии.

    Итого, накладные расходы на занесение в R0 адреса таблицы конкретного терминала и переход к общей программе обслуживания всего два слова (4 байта) на каждый терминал.
    Последний раз редактировалось AFZ; 05.12.2016 в 10:48.
    Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)

  4. #44

    Регистрация
    28.11.2016
    Адрес
    г. Санкт-Петербург
    Сообщений
    9
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну что, вроде ожили? Чего было-то? Форум в воскресенье висел или лежал?

    Цитата Сообщение от Titus Посмотреть сообщение
    Ааа) PC же перескакивает команду SEC автоинкрементом)
    Ну, PDP-шники, вы извращенцы) А такие методы адресации этому лишь способствуют)
    Пардон, месье, я вижу — Вы в нашем деле новичок и ещё не успели познать всю радость извращений! А что Вы скажете на пару_строк кода 8080?:
    Код:
    error    EQU noerror+1
    noerror: CPI 37h
             RET
    Как Вы думаете, куда будет передано управление по метке error и какой такой метод адресации использован в команде по метке noerror?
    Правда, у 80-го процессора есть однобайтные команды условного возврата из подпрограмм, так что ему будет дешевле написать условный возврат, нежели вышеприведённый код. А с вызовом подпрограмм уже не так: у 11-го процессора вызов занимает 4 байта, а у 8080 — три, что, казалось бы, даёт ему экономию кода в 25%. Но!!! Вы верно заметили про "такие методы адресации"! В 11-м процессоре есть такие методы адресации, которые требуют при вызове подпрограммы всего 2-х байтов кода, так что при их использовании 8080 уже отстаёт по краткости кода, причём на 33%. Однако и это не всё!
    Практическая польза при программировании в среде RT-11 на ассемблере заключается в возможности вызовов подпрограмм вообще без команд вызова подпрограмм, а просто по именам! Вот пример такого кода, который типа печатает на экране результат А*В+D/F:
    Код:
         F_MUL А, В, С ; вызов подпрограммы умножения А и В с занесением результата в С
         F_DIV D, E, F ; вызов подпрограммы деления D на E с занесением результата в F
         F_ADD C, F, G ; вызов подпрограммы сложения C и F с занесением результата в G
         F_TYPE G      ; вызов подпрограммы печати G на экране
    Где-то поодаль находятся коды подпрограмм F_MUL, F_DIV, F_ADD (она же F_SUB) и F_TYPE, а также переменные.
    Программистская фишка здесь заключается в настройке регистра (например, R4) на начало такого блока "данных" и завершении каждой из подпрограмм командой не RET, a JMP @(R4)+, так что указанный регистр выполняет функцию как бы счётчика команд, если считать F_MUL (и прочие) командами, а не именами подпрограмм. Но поскольку и эти "команды", и данные к ним находятся вперемежку, то этот же регистр выполняет функцию и как бы указателя стека, только растущего не вниз, а вверх, как и счётчик команд. Как Вам, месье, понравится такое извращение?
    На самом деле я всего лишь привёл упрощённый пример куска фортрановского кода от RT11, который, впрочем, без упрощений не стеснялся применять и в своих ассемблерных программах. Понятно, что в вычислительных задачах количество вызовов наиболее ходовых подпрограмм (+, -, * и /, а также присвоения и преобразования данных) столь велико, что экономия по одному слову памяти на каждый вызов, а, главное, экономия времени от неиспользования обычного стека (как это было бы при обычных вызовах CALL) получается весьма заметной.
    Всего доброго.
    Евгений.

  5. #45

    Регистрация
    27.05.2009
    Адрес
    СССР, Новосибирск
    Сообщений
    5,850
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    289
    Поблагодарили
    233 сообщений
    Mentioned
    30 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Eats Посмотреть сообщение
    у 11-го процессора вызов занимает 4 байта
    Ну не всегда - зависит от того как вызывать

    - - - Добавлено - - -

    Цитата Сообщение от form Посмотреть сообщение
    как вызывать
    Кстати, повторюсь - где-то уже писал, но напомнить фичу не помешает
    Код:
    	JSR	R0,@PC
    	JSR	R1,@PC
    	JSR	R2,@PC
    	...
    Правильно, это сохранение регистров в стеке, при том не меняя C,V,Z,N в PSW
    Последний раз редактировалось form; 05.12.2016 в 15:43.
    PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
    Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
    PMI: KDJ11-BF, MSV11-JE
    VT220, CM7209

  6. #46

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,373
    Спасибо Благодарностей отдано 
    1,695
    Спасибо Благодарностей получено 
    2,214
    Поблагодарили
    868 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от Eats Посмотреть сообщение
    Пардон, месье, я вижу — Вы в нашем деле новичок и ещё не успели познать всю радость извращений! А что Вы скажете на пару_строк кода 8080?:
    Код:

    error EQU noerror+1
    noerror: CPI 37h
    RET

    Как Вы думаете, куда будет передано управление по метке error и какой такой метод адресации использован в команде по метке noerror?
    Не спрашивайте меня такие сложные вопросы)

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

  8. #47

    Регистрация
    27.05.2009
    Адрес
    СССР, Новосибирск
    Сообщений
    5,850
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    289
    Поблагодарили
    233 сообщений
    Mentioned
    30 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    сложные вопросы
    Сложные вопросы можно даже в RT-11 организовать
    Код:
    .TY TEST.MAC
            .TITLE  TEST
            .MCALL  .EXIT,.PRINT
    
            .PSECT  CODE,I
    TEXT:   .ASCIZ  /I=D/                   ;XXX EVEN
    
    START:  .PRINT  #TEXT                   ;PRINT
            .EXIT                           ;EXIT
    
            .PSECT  DATA,D
            .ASCIZ  /I<>D/
    
            .END    START
    
    
    .MAC TEST
    
    .LIN TEST/RUN
    I=D
    
    .LIN TEST/RUN/ID
    I<>D
    
    .
    А мой любимый "сложный" вопрос - про фортран: CALL SUB(1) - объяснить что делает данный оператор
    Большинство знакомых программеров (даже тех кто знает фортран с далеких времен) отвечает неправильно (хотя с появлением всякого дерьма вроде g77 их ответ можно принять)
    PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
    Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
    PMI: KDJ11-BF, MSV11-JE
    VT220, CM7209

  9. #48

    Регистрация
    28.11.2016
    Адрес
    г. Санкт-Петербург
    Сообщений
    9
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от form Посмотреть сообщение
    А мой любимый "сложный" вопрос - про фортран: CALL SUB(1) - объяснить что делает данный оператор
    Большинство знакомых программеров (даже тех кто знает фортран с далеких времен) отвечает неправильно
    Холмс и Ватсон летят на воздушном шаре, поднялись уже высоко - за облака. Ватсон не выдержал и спрашивает:
    - Холмс, как Вы думаете, где мы находимся?
    - В корзине воздушного шара, дорогой Ватсон, - невозмутимо ответил Холмс.

    Вот у Вас как код написан неряшливо, так же неряшливо Вы и вопрос пытаетесь задать. Обратите внимание: он у Вас даже не заканчивается вопросительным знаком! А ведь известно: какой вопрос, такой и ответ. По-моему, такая неаккуратность нехороша для программиста, выглядит как неуважение к остальным...
    Всего доброго.
    Евгений.

  10. #49

    Регистрация
    30.08.2011
    Адрес
    Зеленоград
    Сообщений
    7,161
    Спасибо Благодарностей отдано 
    2,979
    Спасибо Благодарностей получено 
    373
    Поблагодарили
    310 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от form Посмотреть сообщение
    А мой любимый "сложный" вопрос - про фортран: CALL SUB(1) - объяснить что делает данный оператор
    Я попытку ответа сделаю основываясь на опыте ПАСКАЛЬ + МАКРО11 и сторонние obj библиотеки,
    такая команда вызывает глобальную процедуру (функцию) SUB и передаёт ей входящий параметр = 1.

    - - - Добавлено - - -

    Цитата Сообщение от Eats Посмотреть сообщение
    Вот у Вас как код написан неряшливо
    в чём вы видите неряшливость кода? вы листинги Корчагина видели ? )))
    Архив программ для УК-НЦ, ДВК и БК.

    Ищу игру "СТРАНА МОНСТРОВ" [monstr.sav] для ДВК.

  11. #50

    Регистрация
    27.05.2009
    Адрес
    СССР, Новосибирск
    Сообщений
    5,850
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    289
    Поблагодарили
    233 сообщений
    Mentioned
    30 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Eats Посмотреть сообщение
    Обратите внимание: он у Вас даже не заканчивается вопросительным знаком!
    Что правильно если внимательно прочитать как он написан

    - - - Добавлено - - -

    Цитата Сообщение от hobot Посмотреть сообщение
    передаёт ей входящий параметр = 1
    Здесь и заключается ошибка
    То есть конечно 1 в качестве параметра передается, но есть нюанс - у фортрана аргументы векторные. С точки зрения паскаля можно считать, что они всегда var, а это уже совсем другая песня

    - - - Добавлено - - -

    Цитата Сообщение от Eats Посмотреть сообщение
    Вот у Вас как код написан неряшливо
    Разумеется не неряшливый код "был, но дискеты потерялись, а потому примеров не дам"?
    PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
    Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
    PMI: KDJ11-BF, MSV11-JE
    VT220, CM7209

Страница 5 из 28 ПерваяПервая 123456789 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Арифметические процедуры на ассемблере
    от spensor в разделе Программирование
    Ответов: 27
    Последнее: 13.05.2017, 20:56
  2. Пишем на ассемблере под эмулятором
    от GM BIT в разделе Для начинающих
    Ответов: 76
    Последнее: 15.07.2016, 20:04
  3. try-catch на ассемблере z80
    от siril в разделе Программирование
    Ответов: 22
    Последнее: 30.10.2012, 21:17
  4. Продам книгу- AMIGA: программирование на ассемблере
    от Doctor Max в разделе Барахолка (архив)
    Ответов: 11
    Последнее: 01.03.2012, 00:35
  5. Подпрограмма на ассемблере в памяти?
    от jimled в разделе Программирование
    Ответов: 1
    Последнее: 29.11.2009, 06:46

Ваши права

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