├── .gitignore ├── README.md ├── SecondAttestation ├── Task01 │ ├── README.md │ ├── Task01.pdp │ └── Task01.txt ├── Task02 │ ├── README.md │ ├── Task02.pdp │ └── Task02.txt ├── Task03 │ ├── README.md │ ├── Task03.pdp │ └── Task03.txt ├── Task04 │ ├── README.md │ ├── Task04.pdp │ └── Task04.txt ├── Task05 │ ├── README.md │ ├── Task05.pdp │ └── Task05.txt └── Task06 │ ├── README.md │ ├── Task06.pdp │ └── Task06.txt └── ThirdAttestation ├── Task07 ├── README.md ├── Task07.pdp └── Task07.txt ├── Task08 ├── README.md ├── Task08.pdp └── Task08.txt ├── Task09 ├── README.md ├── Task09.pdp └── Task09.txt ├── Task10 ├── README.md ├── Task10.pdp └── Task10.txt └── Task11 ├── README.md ├── Task11.pdp └── Task11.txt /.gitignore: -------------------------------------------------------------------------------- 1 | .*.swp 2 | .*~ 3 | .*.txt~ 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Аппаратные Средства Вычислительной Техники 2 | 3 | ## Зачем нужен этот репозиторий 4 | 5 | Он содержит решения к практическим задачам курса (возможно объяснения тоже появятся). 6 | 7 | Также было бы неплохо, если бы после самостоятельного понимания этих решений, писать для вас на ассемблере стало таким же естественным как ходить (простите). 8 | 9 | ## Задания 10 | 11 | ### Вторая аттестация 12 | 13 | - **[Задание 1](/SecondAttestation/Task01)** 14 | - **[Задание 2](/SecondAttestation/Task02)** 15 | - **[Задание 3](/SecondAttestation/Task03)** 16 | - **[Задание 4](/SecondAttestation/Task04)** 17 | - **[Задание 5](/SecondAttestation/Task05)** 18 | - **[Задание 6](/SecondAttestation/Task06)** 19 | 20 | ### Третья аттестация 21 | 22 | - **[Задание 7](/ThirdAttestation/Task07)** 23 | - **[Задание 8](/ThirdAttestation/Task08)** 24 | - **[Задание 9](/ThirdAttestation/Task09)** 25 | - **[Задание 10](/ThirdAttestation/Task10)** 26 | - **[Задание 11](/ThirdAttestation/Task11)** - прочитайте предупреждение! 27 | 28 | ## Полезные источники 29 | 30 | - **"Методическое пособие по курсу. Лабораторные занятия"** - в мудле (страница 80 - начало приложения с командами). 31 | - **[Режимы адресации PDP-11 (на английском).](https://pages.cpsc.ucalgary.ca/~dsb/PDP11/AddrModes.html)** 32 | 33 | ## Благодарности 34 | 35 | - **[@PavelPutin](https://github.com/PavelPutin)** - за исходный репозиторий, в котором были **решённые** задания, на которые можно было опираться. 36 | - **[@AveWycc220](https://github.com/AveWycc220)** - за 10 задачу в его репозитории. 37 | -------------------------------------------------------------------------------- /SecondAttestation/Task01/README.md: -------------------------------------------------------------------------------- 1 | # Задача 1 2 | 3 | ## Условие 4 | 5 | Используя автоинкрементный метод адресации и регистр R4 выполнить прибавление единицы к ячейке 1036 с данными 45. 6 | -------------------------------------------------------------------------------- /SecondAttestation/Task01/Task01.pdp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexEreh/ComputerHardware/4b2ff930b237e17bb92d951d39d633bac2524300/SecondAttestation/Task01/Task01.pdp -------------------------------------------------------------------------------- /SecondAttestation/Task01/Task01.txt: -------------------------------------------------------------------------------- 1 | 012704 // MOVE #1036 R4 ; Помещаем 1046 в R4. 2 | 001036 ; 1 операнд. 3 | 012714 // MOVE #45 @R4 ; Помещаем 45 в ячейку по адресу, который в регистре R4. 4 | 000045 ; 1 операнд. 5 | 005224 // INC (R4)+ ; Автоинкрементно прибавляем единицу к ячейке с адресом в регистре R4. 6 | 000000 // HALT ; Конец. -------------------------------------------------------------------------------- /SecondAttestation/Task02/README.md: -------------------------------------------------------------------------------- 1 | # Задача 2 2 | 3 | ## Условие 4 | 5 | Используя Индексный метод адресации переместить данные из ячейки 1002 - 6677 в ячейку 1022. Воспользоваться регистрами R0 и R5. 6 | -------------------------------------------------------------------------------- /SecondAttestation/Task02/Task02.pdp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexEreh/ComputerHardware/4b2ff930b237e17bb92d951d39d633bac2524300/SecondAttestation/Task02/Task02.pdp -------------------------------------------------------------------------------- /SecondAttestation/Task02/Task02.txt: -------------------------------------------------------------------------------- 1 | /// Записываем данные из условия в память. 2 | 012737 // MOV #6677, @#1002 ; Помещаем 6677 в ячейку 1002. 3 | 006677 ; 1 операнд. 4 | 001002 ; 2 операнд. 5 | 6 | /// Записываем относительный адрес первого операнда в R0. 7 | 012700 // MOV #2, R0 ; Помещаем 2 в R0. 8 | 000002 ; 1 операнд. 9 | 10 | /// Записываем относительный адрес второго операнда в R5. 11 | 012705 // MOV #22, R5 ; Помещаем 22 в R5. 12 | 000022 ; 1 операнд 13 | 14 | /// Пересылаем данные индексным методом адресации (согласно заданию). 15 | 016065 // MOV 1000(R0), 1000(R5) ; Из ячейки, адрес который формируется сложением 1000 и значения R0 16 | ; копируем данные в ячейку, адрес который формируется сложением 1000 и значения R5. 17 | 001000 ; 1 операнд (смещение). 18 | 001000 ; 2 операнд (смещение). -------------------------------------------------------------------------------- /SecondAttestation/Task03/README.md: -------------------------------------------------------------------------------- 1 | # Задача 3 2 | 3 | ## Условие 4 | 5 | Используя регистровый и автодекрементный методы адресации вычислить разность 1010 - 56 и R0 - 40. Результат записать в 1010. 6 | 7 | ## Бинарник 8 | 9 | Начальное значение регистра счётчика команд - 754 (адрес начала программы). 10 | -------------------------------------------------------------------------------- /SecondAttestation/Task03/Task03.pdp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexEreh/ComputerHardware/4b2ff930b237e17bb92d951d39d633bac2524300/SecondAttestation/Task03/Task03.pdp -------------------------------------------------------------------------------- /SecondAttestation/Task03/Task03.txt: -------------------------------------------------------------------------------- 1 | 012737 // MOV #56 @#1010 ; Помещаем 56 в ячейку с адресом 1010. 2 | 000056 ; 1 операнд. 3 | 001010 ; 2 операнд. 4 | 012700 // MOV #40 R0 ; Помещаем 40 в R0. 5 | 000040 ; 1 операнд. 6 | 012701 // MOV #1012 R1 ; Помещаем 1012 в R1. 7 | 001012 ; 1 операнд. 8 | 160041 // SUB R0 -(R1) ; Сделать то, что собственно нужно в таске. Хз как описать коротко. 9 | 000000 // HALT ; Конец. -------------------------------------------------------------------------------- /SecondAttestation/Task04/README.md: -------------------------------------------------------------------------------- 1 | # Задача 4 2 | 3 | ## Условие 4 | 5 | Копирование массива машинных слов из 6 элементов из области ОЗУ 1010-1022 в область 1050-1062 (использование автоинкрементного метода адресации, регистров R3, R4, цикл на основе операции SOB). 6 | -------------------------------------------------------------------------------- /SecondAttestation/Task04/Task04.pdp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexEreh/ComputerHardware/4b2ff930b237e17bb92d951d39d633bac2524300/SecondAttestation/Task04/Task04.pdp -------------------------------------------------------------------------------- /SecondAttestation/Task04/Task04.txt: -------------------------------------------------------------------------------- 1 | 012703 // MOV #1010 R3 ; Помещаем 1010 в R3. 2 | 001010 ; 1 операнд 3 | 012704 // MOV #1050 R4 ; Помещаем 1050 в R4. 4 | 001050 ; 1 операнд. 5 | 012702 // MOV #6 R2 ; Помещаем 6 в R2. 6 | 000006 ; 1 операнд. 7 | 012324 // MOV (R3+) (R4+) ; 8 | 077202 // SOB R4 ; 9 | 000000 // HALT ; Конец. -------------------------------------------------------------------------------- /SecondAttestation/Task05/README.md: -------------------------------------------------------------------------------- 1 | # Задача 5 2 | 3 | ## Условие 4 | 5 | Вычисление размера массива, начинающегося с адреса 1040, признак конца массива – нулевое слово (Автоинкрементный метод адресации с использованием R5, цикл на основе операции TST и команды ветвления BNE - BEQ). 6 | -------------------------------------------------------------------------------- /SecondAttestation/Task05/Task05.pdp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexEreh/ComputerHardware/4b2ff930b237e17bb92d951d39d633bac2524300/SecondAttestation/Task05/Task05.pdp -------------------------------------------------------------------------------- /SecondAttestation/Task05/Task05.txt: -------------------------------------------------------------------------------- 1 | 000000 ; Переменная LENGTH. 2 | 012767 // MOV #0, 1 ; Инициализируем переменную LENGTH. 3 | 000000 ; 1 операнд. 4 | 000001 ; 2 операнд. 5 | 012705 // MOV #1040, R5 ; Помещаем адрес начала массива в R5. 6 | 001040 ; 1 операнд. 7 | 005725 // TST (R5)+ ; Проверяем число по адресу в регистре R5 и прибавляем к R5 единицу. 8 | 001403 // BEQ 1020 ; Если числа нет (массив уже пройден полностью) - заканчиваем выполнение программы. 9 | 005267 // INC LENGTH ; Прибавляем единицу к переменной LENGTH. 10 | 177766 ; 1 операнд. 11 | 001775 // BNE 1006 ; Если же число было - продолжаем перебор. 12 | 000000 // HALT ; Конец. -------------------------------------------------------------------------------- /SecondAttestation/Task06/README.md: -------------------------------------------------------------------------------- 1 | # Задача 6 2 | 3 | ## Условие 4 | 5 | Вычисление суммы элементов массива состоящего из 5 элементов и начинающегося с адреса 1040 (использование автоинкрементного метода адресации, регистров R4 и R5, цикл на основе операции SOB). 6 | -------------------------------------------------------------------------------- /SecondAttestation/Task06/Task06.pdp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexEreh/ComputerHardware/4b2ff930b237e17bb92d951d39d633bac2524300/SecondAttestation/Task06/Task06.pdp -------------------------------------------------------------------------------- /SecondAttestation/Task06/Task06.txt: -------------------------------------------------------------------------------- 1 | 000000 // VAR: SUM 2 | 012767 // MOV #0 1 // ИНИЦИАЛИЗИРУЕМ ПЕРЕМЕННУЮ SUM 3 | 000000 // 1 операнд 4 | 000001 // 2 операнд 5 | 012705 // MOV #1040 R5 6 | 001040 // 1 операнд 7 | 012704 // MOV #5 R4 8 | 000005 // 1 операнд 9 | 062567 // ADD (R5+) @-14 // ADD (R5+) SUM 10 | 177766 // 2 операнд 11 | 077403 // SOB R4 3 -------------------------------------------------------------------------------- /ThirdAttestation/Task07/README.md: -------------------------------------------------------------------------------- 1 | # Задача 7 2 | 3 | ## Условие 4 | 5 | Подсчет числа двоичных единиц в слове (использование операций сдвига ASL, ASR и ветвления BCC – BCS и регистры R2 и R3). 6 | 7 | ## Указание 8 | 9 | Слово, двоичные единицы которого следует посчитать, находится в R0. 10 | Результат алгоритма будет записан в R1. Регистры R2 и R3 в алгоритме используются (R2 - счётчик довичных единиц, R3 - промежуточное число, над которым совершается арифметический сдвиг). 11 | -------------------------------------------------------------------------------- /ThirdAttestation/Task07/Task07.pdp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexEreh/ComputerHardware/4b2ff930b237e17bb92d951d39d633bac2524300/ThirdAttestation/Task07/Task07.pdp -------------------------------------------------------------------------------- /ThirdAttestation/Task07/Task07.txt: -------------------------------------------------------------------------------- 1 | /// Подготовка к алгоритму: 2 | 010003 // MOV R0, R3 ; Копируем значение R0 в R3 3 | 005002 // CLR R2 ; Стираем регистр, который является счётчиком двоичных единиц. 4 | 5 | /// Непосредственно алгоритм: 6 | 006203 // ASR R3 ; Сдвигаем биты R3 вправо (делим на 2 и округляем в меньшую сторону). 7 | ; Бит C(arry) РСП делается 1 если младший разряд = 1 после сдвига 8 | 103401 // BCS +1 ; Если в младшем разряде единица - прибавляем единицу (прыжок до INC R2). 9 | 103002 // BCC +2 ; Если в младшем разряде ноль - продолжаем сдвигать (прыжок до BNE -5). 10 | 005202 // INC R2 ; Прибавляем единицу к счётчику единиц. 11 | 005703 // TST R3 ; Проверяем сдвигаемый регистр. 12 | 001372 // BNE -5 ; Если число не равно нулю - продолжаем сдвигать (прыжок на ASR R3). 13 | 14 | /// Пишем резльтат в регистр R1 из R2: 15 | 010201 // MOV R2, R1 ; Копируем значение R2 в R1. 16 | 005002 // CLR R2 ; Стираем R2 (на всякий). 17 | 18 | 000000 // HALT ; Конец. 19 | -------------------------------------------------------------------------------- /ThirdAttestation/Task08/README.md: -------------------------------------------------------------------------------- 1 | # Задача 8 2 | 3 | ## Условие 4 | 5 | “Русский крестьянский” метод умножения целых чисел (использование операций сдвига ASL, ASR и ветвления BCC – BCS, в качестве умножаемых чисел использовать регистры R0 и R1, результат записать в R2). 6 | -------------------------------------------------------------------------------- /ThirdAttestation/Task08/Task08.pdp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexEreh/ComputerHardware/4b2ff930b237e17bb92d951d39d633bac2524300/ThirdAttestation/Task08/Task08.pdp -------------------------------------------------------------------------------- /ThirdAttestation/Task08/Task08.txt: -------------------------------------------------------------------------------- 1 | /// Обнуляем результат (R2): 2 | 005002 // CLR R2 ; помещаем 0 в R2 3 | 4 | /// Сохраняем значение в будущем сдвигаемых регистров в иные регистры: 5 | 010003 // MOV R0, R3 ; помещаем значение регистра R0 в R3 6 | 010104 // MOV R1, R4 ; помещаем значение регистра R1 в R4 7 | 8 | /// Обработка первого операнда (R0): 9 | 005700 // TST R0 ; проверяем R0 10 | 100401 // BMI 1 ; если регистр отрицательный - переводим из ДК 11 | 100001 // BPL 1 ; если регистр положительный - пропускаем перевод 12 | 005400 // NEG R0 ; переводим из ДК в ПК 13 | 14 | /// Обработка второго операнда (R1): 15 | 005701 // TST R1 ; проверяем R1 16 | 100401 // BMI 1 ; если операнд отрицательный - переводим из ДК 17 | 100001 // BPL 1 ; если операнд положительный - пропускаем перевод 18 | 005401 // NEG R1 ; переводим из ДК в ПК 19 | 20 | /// Непосредственно алгоритм: 21 | 006200 // ASR R0 ; делим один из операндов (на 2) 22 | 103401 // BCS 1 ; если нечётное - накапливаем результат 23 | 103001 // BCC 1 ; если чётное - пропускаем накапливание 24 | 060102 // ADD R1 R2 ; накапливаем результат 25 | 006301 // ASL R1 ; удваиваем один из операндов 26 | 005700 // TST R0 ; уменьшаемый операнд равен нулю? 27 | 001371 // BNE -13 ; если не равен - продолжаем делить (сдвигать влево) 28 | 29 | /// Восстанавливаем исходное значение сдвигаемых регистров с помощью иных регистров. 30 | 010300 // MOV R3, R0 ; помещаем значение регистра R3 в R0 31 | 010401 // MOV R4, R1 ; помещаем значение регистра R4 в R1 32 | 33 | 000000 // HALT ; конец. -------------------------------------------------------------------------------- /ThirdAttestation/Task09/README.md: -------------------------------------------------------------------------------- 1 | # Задача 9 2 | 3 | ## Условие 4 | 5 | Перемножение элементов массива на основе подпрограммы “русский крестьянский” метод (первый массив находится по адресу 1034-1044, второй массив 1050-1060). Можно решить двумя способами: перемножить только соответствующие элементы массивов или перемножить каждый на каждый элементы массивов, получив в ответе 25 элементов. Во втором случае оценка на 30 баллов выше. 6 | 7 | ## Указание 8 | 9 | Сделана более сложная версия. Результат (итоговый массив) перемножения каждого на каждый начиная с 1064. 10 | 11 | Адрес начала программы - 1216. Адрес начала подпрограммы - 1150. 12 | -------------------------------------------------------------------------------- /ThirdAttestation/Task09/Task09.pdp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexEreh/ComputerHardware/4b2ff930b237e17bb92d951d39d633bac2524300/ThirdAttestation/Task09/Task09.pdp -------------------------------------------------------------------------------- /ThirdAttestation/Task09/Task09.txt: -------------------------------------------------------------------------------- 1 | См. пояснения к подпрограмме в задаче 8. 2 | 3 | /*********** Подпрограмма УМНОЖЕНИЕ (1150) ***********/ 4 | 005002 // CLR R2 5 | 6 | 005700 // TST R0 7 | 100401 // BMI +1 8 | 100001 // BPL +1 9 | 005400 // NEG R0 10 | 11 | 005701 // TST R1 12 | 100401 // BMI +1 13 | 100001 // BPL +1 14 | 005401 // NEG R1 15 | 16 | 006200 // ASR R0 17 | 103401 // BCS +1 18 | 103001 // BCC +1 19 | 060102 // ADD R1, R2 20 | 006301 // ASL R1 21 | 005700 // TST R0 22 | 001371 // BNE -13 23 | 24 | 000207 // RTS PC ; Выход из подпрограммы. 25 | 26 | 27 | 28 | /*********** Основная программа (1216) ***********/ 29 | 012700 // MOV #5, R0 ; Поместить размер первого массива в R0 30 | 000005 ; 31 | 012703 // MOV #1034, R3 ; Поместить адрес начала первого массива в R3 32 | 001034 ; 33 | 012705 // MOV #1064, R5 ; Поместить адрес итогого массива в R5 34 | 001064 ; 35 | 012701 // MOV #5, R1 ; Поместить размер второго массива в R1 36 | 000005 ; 37 | 012704 // MOV #1050, R4 ; Поместить адрес начала второго массива в R4 38 | 001050 ; 39 | 010046 // MOV R0, -(R6) ; Поместить размер первого массива в стек 40 | 010146 // MOV R1, -(R6) ; Поместить размер второго массива в стек 41 | 011300 // MOV @R3, R0 ; Поместить первый множитель 42 | 012401 // MOV (R4+), R1 ; Поместить второй множитель 43 | 004737 // JSR PC УМНОЖЕНИЕ ; Выполнить умножение (перейти к соответствующей подпрограмме) 44 | 001150 ; Адрес начала подпрограммы 45 | 012601 // MOV (R6)+, R1 ; Вытолкнуть из стека размер второго массива 46 | 012600 // MOV (R6)+, R0 ; Вытолкнуть из стека размер первого массива 47 | 010225 // MOV R2, (R5)+ ; Переслать произведение в итоговый массив 48 | 077112 // SOB R1, 8 ; Цикл по второму массиву 49 | 005203 // INC R3 ; 50 | 005203 // INC R3 ; Переход к следующему элементу первого массива 51 | 077021 // SOB R0, #1256 ; Цикл по первому массиву 52 | 001256 ; 53 | 000000 // HALT ; Конец. -------------------------------------------------------------------------------- /ThirdAttestation/Task10/README.md: -------------------------------------------------------------------------------- 1 | # Задача 10 2 | 3 | ## Условие 4 | 5 | Записать в R1 - число, R2 - месяц, R3 - год (методом непосредственной адресации). Сформировать цикл (команда SOB). Количество прохождений = R2, и обратиться к подпрограмме (JSR, RTS), выполняющей следующее: записывает в ячейку по адресу находящимуся в R1, квадрат числа из регистра R1, устанавливает следующий адрес для записи (R1+R2+2). 6 | 7 | ## Указание 8 | 9 | Адрес начала программы - 1000. Адрес начала подпрограммы - 1050. 10 | -------------------------------------------------------------------------------- /ThirdAttestation/Task10/Task10.pdp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexEreh/ComputerHardware/4b2ff930b237e17bb92d951d39d633bac2524300/ThirdAttestation/Task10/Task10.pdp -------------------------------------------------------------------------------- /ThirdAttestation/Task10/Task10.txt: -------------------------------------------------------------------------------- 1 | /*********** Подпрограмма ЗАПИСЬПЕРЕХОД (1050) ***********/ 2 | 010104 // MOV R1, R4 ; Копируем данные из R1 в R4. 3 | 010105 // MOV R1, R5 ; Копируем данные из R1 в R5. 4 | 005000 // CLR R0 ; Стираем регистр R0. 5 | 6 | 005705 // TST R5 ; Проверяем число в регистре R5, оно же R1. 7 | 001405 // BEQ 1074 ; Если равно нулю - прыгаем на (MOV R0, @R1). 8 | 006205 // ASR R5 ; Арифметически сдвигаем число в регистре R5 вправо. 9 | 103001 // BCC 1070 ; Если в младшем разряде итогового числа после переноса 0 - пропускаем следующую инструкцию. 10 | 060400 // ADD R4, R0 ; Прибавляем к регистру R0 число из регистра R4. 11 | 006304 // ASL R4 ; Сдвигаем число в регистре R4 влево. 12 | 000771 // BR 1056 ; Прыгаем на (TST R5). 13 | 14 | 010011 // MOV R0, @R1 ; Копируем значение регистра R0 в ячейку, адрес которой находится в регистре R1. 15 | 060201 // ADD R2, R1 ; Прибавляем к значению регистра R1 регистр R2. 16 | 062701 // ADD #2, R1 ; Прибавляем двойку к значению регистра R1. 17 | 000002 ; 18 | 000206 // RTS R6 ; Выход из подпрограммы. 19 | 20 | 21 | 22 | /*********** Основная программа (1000) ***********/ 23 | 012701 // MOV #11, R1 ; Помещаем в R1 "Число" - адрес начала каких-то последовательностей в памяти. 24 | 000011 25 | 012702 // MOV #2, R2 ; Помещаем в R2 "Месяц" - количество элементов последовательности. 26 | 000002 27 | 012703 // MOV #3744, R3 ; Помещаем в R3 "Год" - ПРОСТО ТАК, ОЧЕНЬ ИНТЕРЕСНО ПОЧЕМУ. 28 | 003744 29 | 004637 // JSR R6, @#1050 ; Переход к подпрограмме "ЗАПИСЬПЕРЕХОД". 30 | 001050 31 | 072203 // SOB R2, 1014 ; Цикл, в котором опять вызываем подпрограмму и который совершается R2 итераций. 32 | 000000 // HALT ; Конец. -------------------------------------------------------------------------------- /ThirdAttestation/Task11/README.md: -------------------------------------------------------------------------------- 1 | # Задача 11 2 | 3 | > **Предупреждение** 4 | > 5 | > Не забудьте поменять по адресу 200 фамилию на свою. Таблица кодов символов ниже. 6 | 7 | ## Условие 8 | 9 | Разместить по адресам начиная с адреса 200 коды букв своей фамилии (буквы английские). С помощью опроса готовности устройства, прерываний и использования процедур вывести свою фамилию на экран (текстовый режим). 10 | 11 | ## Указание 12 | 13 | Адрес начала программы - 1000. 14 | 15 | ## Коды латинских символов в восьмеричном представлении 16 | 17 | |Символ|Код| 18 | |------|---| 19 | | A |101| 20 | | B |102| 21 | | C |103| 22 | | D |104| 23 | | E |105| 24 | | F |106| 25 | | G |107| 26 | | H |110| 27 | | I |111| 28 | | J |112| 29 | | K |113| 30 | | L |114| 31 | | M |115| 32 | | N |116| 33 | | O |117| 34 | | P |120| 35 | | Q |121| 36 | | R |122| 37 | | S |123| 38 | | T |124| 39 | | U |125| 40 | | V |126| 41 | | W |127| 42 | | X |130| 43 | | Y |131| 44 | | Z |132| 45 | -------------------------------------------------------------------------------- /ThirdAttestation/Task11/Task11.pdp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexEreh/ComputerHardware/4b2ff930b237e17bb92d951d39d633bac2524300/ThirdAttestation/Task11/Task11.pdp -------------------------------------------------------------------------------- /ThirdAttestation/Task11/Task11.txt: -------------------------------------------------------------------------------- 1 | /*********** Участок памяти (200-...) ***********/ 2 | 000114 // L 3 | 000101 // A 4 | 000123 // S 5 | 000124 // T 6 | 000116 // N 7 | 000101 // A 8 | 000115 // M 9 | 000105 // E 10 | 11 | 12 | /*********** Основная программа (1000) ***********/ 13 | 012701 // MOV 200, R1 ; Помещаем адрес начала массива символов в R1 14 | 000200 ; 1 операнд 15 | 16 | /// Вычисляем размер фамилии 17 | 005004 // CLR R4 ; Стираем R4 (в нём будет размер фамилии). 18 | 010105 // MOV R1, R5 ; Копируем адрес начала массива (из R1) в R5. 19 | 005725 // TST (R5)+ ; Проверяем число по адресу в регистре R5 и прибавляем к R5 единицу. 20 | 001402 // BEQ 1020 ; Если не нашли символа - начинаем вывод на экран (прыгаем к TSTB). 21 | 005204 // INC R4 ; Иначе прибавляем к R4 (размеру фамилии) единицу. 22 | 001374 // BNE 1010 ; Если был символ не пустой - продолжаем проходиться. 23 | 24 | /// То что непосредственно требуется (вывод на экран) 25 | 105737 // TSTB 177564 ; Проверка адреса регистра состояния экрана (регистр внешнего устройства - экрана). 26 | 177564 ; Адрес регистра состояния экрана. 27 | 100376 // BPL 1022 ; Если результат положительный, то дропаемся на 1000 28 | ; (то есть если произошло такое, что внешнее устройство пока не готово принимать данные). 29 | 012137 // MOV (R1)+, @#177566 ; Пересылаем в адрес регистра данных монитора символ по адресу в R1. 30 | 177566 ; Адрес регистра данных монитора (2 операнд предыдущей команды). 31 | 077405 // SOB R4, 1022 ; Дропаемся на 1022 пока R4 не обнулится. 32 | 000000 // HALT ; Конец. --------------------------------------------------------------------------------