Архитектура ЭВМ. Архитектура
Скачать 392.83 Kb.
|
4.5. Содержание отчета 1. Исходная программа для заданного варианта. 2. Листинг программы. 3. Результаты выполнения программы. 36 Лабораторная работа 5 РАЗРАБОТКА И ОТЛАДКА 32-РАЗРЯДНЫХ ПРИКЛАДНЫХ ПРОГРАММ НА БАЗЕ МП 80Х86 5.1. Цель работы Целью работы является изучение этапов разработки и отладки про- грамм на языке ассемблера 32-разрядных МП 80х86 (или Х86) для реаль- ного режима их работы. 5.2. Особенности разработки 32-разрядных программ на языке ас- семблера МП i80x86 для реального режима Микропроцессоры i80386, i80486, Pentium имеют режимы: реально- го адреса (R-режима) и защищенного (P-режима). Только в Р-режиме МП i386, i486, Pentium выполняют 32-битные программы с использованием всех новых возможностей 32-разрядных МП (МП-32): 1) адресное пространство памяти — 4 Гбайт; 2) использование 32-битной адресации команд; 3) новые привилегированные команды для защищенного режима; 4) применение 32-битных РОНов МП (EAX, EBX, ECX и т.д.); 5) использование масштабированной индексной адресации, напри- мер: MOV EAX, [EBX+ESI*2+200h] — базовая индексная с масштабиро- ванием и смещением (может содержать до 15 байт); 6) использование режимов 32-битной адресации данных, включая и новые для МП-32 режимы, например, варианты индексной адресации с масштабированием. Однако есть возможность использовать преимущества, указанные в пп. 4-6, если МП-32 работает в реальном режиме. Единственный минус – все эти программы для R-режима работают только в сегментах емкостью 64 Кбайт и в памяти 1 Мбайт. Это объясняет- ся тем, что старшие биты А31-А16 эффективного адреса, например [EBX] или [ESI], не изменяются. Если используются 32-битные адреса и операнды, то команда (рис. 5.1) содержит дополнительные байты – атрибуты: 66h — размер опе- ранда 32 бита; 67h — размер адреса 32 бита. По умолчанию ассемблер генерирует коды для 16-разрядного МП i8086. Если он встретит команду из другого МП, то транслятор сгенерирует ошибку, что указывает на другой тип используемого МП. Поэтому необ- ходимо указывать тип МП: . 386 . 486. 37 Для задания сегментов могут быть использованы директивы SEGMENT – начало сегмента и ENDS – конец сегмента. Префикс коман- ды REP 0-1 байт Префикс размера адреса 0-1 байт Префикс размера операнда 0-1 байт Префикс замены сегмента 0-1 байт 67h 66h КОП 1 или 2 байта mod reg r/m 0 или 1 байт Масштаб 0 или 1 байт Смещение в команде 0-2, 4 байта Непосредств. операнд 0-2, 4 байта Коэф. 1, 2, 4, 8 Рис. 5.1. Формат команды МП i80x86 На рис. 5.2 приведена схема формирования эффективного адреса при 32-битной адресации для командыmov EAX, [EBX+ESI*2+200h]. База Смещение Индекс 1, 2, 4, 8 * + + 31 31 0 0 EBX 200H ESI 2 ЕЕА Рис. 5.2. Схема формирования адреса EЕА=EBX+ESI*2+200h Далее приведен пример 5.1 программы для R-режима с использова- нием 32-битных регистров и 32-битных режимов адресации данных. Пример 5.1. Программа на языке ассемблера МП i486 с использованием 32-битных регистров и режимов адресации данных для R-режима .486 stack1 segment stack use16 ‘stack’ db 64 dup(0) ;Стек 64 байта stack1 ends dseg segment para use16 ‘data’ k dd +60h ;Переменные k r dd -10h ; r n dd +30h ; n m dd 0 ;Результат m dseg ends cseg segment para use16 ‘code’ assume cs:cseg,ds:dseg,ss:stack1 begin proc far ;Дальняя процедура push ds 38 sub eax,eax push ax mov ax,dseg ;Указание регистру ds mov ds,ax ; на сегмент данных ;Команды программы mov ebx,offset k mov esi,2 mov eax,[ebx] ;Вычисление sub eax,[ebx+esi*2] ; выражения add eax,[ebx+esi*4] ; m= add eax,120h ; = n-r+k+120 mov [ebx+8+4],eax mov ah,4ch int 21h begin endp cseg ends end begin В программе применяются индексная с масштабированием адреса- ция данных (см. рис. 5.2) и стандартные директивы ассемблера. В частно- сти, директива USE16 используется для R-режима, при котором МП рабо- тает в сегментах емкостью 64 Кбайт, но с использованием 32-битных реги- стров и режимов адресации данных, хотя адреса команд 16-битные. Порядок_выполнения_работы_Порядок__формирования_ЕХЕ-файла_разработанной_32-битной_программы__с_отладочной_информацией'>5.3. Порядок выполнения работы Порядок формирования ЕХЕ-файла разработанной 32-битной программы с отладочной информацией 1. Для созданного исходного файла с расширением .asm выполните последовательность программ: tasm /zi <имя файла>.asm,, tlink /3/v <имя файла>.obj td <имя файла>.exe Порядок работы в отладчике td.exe: 2. Войдите в окно регистров F10, VIEW, REGISTER [ENTER]; 3. Находясь в окне регистров, вызовите локальное меню (Alt-F10) и установите длину регистров 32 бита REGISTER 32 bit YES 4. Установите длину данных 4 байта: F10, VIEW, DUMP, Ctrl-D, LONG 5. Последовательно, нажимая F8, выполните все команды до mov ds, ax (включительно). 39 6. В окне данных установите начальный адрес данных Alt-F10, GOTO, DS:0 [ENTER] 7. Выполните далее программу по шагам (F8), наблюдая за результа- тами. 8. Просмотрите кодировку программы: F10, CPU. 9. Разработайте на языке ассемблера МП X86 32-разрядную про- грамму вычисления заданного в работе 1 варианта выражения. Принять длину операндов 32 бита. Пусть все операнды размещены в памяти. По аналогии с пп. 1-8 произведите отладку программы. 5.4. Содержание отчета 1. Исходная программа для заданного варианта. 2. Листинг программы. 3. Результаты выполнения программы. Лабораторная работа № 6 КОМАНДЫ ОБРАБОТКИ ЦЕПОЧЕК МП Х86 6.1. Цель работы Изучение цепочечных команд МП Х86 и их использования в про- граммах обработки цепочек (строк) данных. 6.2. Цепочечные команды Под цепочкой понимается последовательность байт или слов, нахо- дящихся в смежных ячейках памяти. Такую связанную структуру данных образует, например, последовательность вводимых с терминала символов. В МП Х86 имеется пять однобайтных цепочечных команд- примитивов (см. Приложение), предназначенных для обработки одного элемента цепочки. Если элементом является байт, то в мнемонике команд указывается буква B, если слово, то – W. Например: MOVSB и MOVSW. В общем случае при обработке строк данных: - цепочка-приемник находится в дополнительном сегменте данных и ее элемент адресуется регистром DI, - цепочка-источник находится в сегменте данных и ее элемент ад- ресуется регистром SI. Задание начальных адресов цепочек приемника STRING1 и источни- ка STRING2 производится командами LEA DI,ES:STRING1 и LEA SI,STRING2. Однако обе цепочки можно разместить в сегменте дан- ных, если перед их обработкой сделать равными значения сегментных ре- гистров ES и DS. В зависимости от состояния признака направления DF регистра F после каждой операции над элементом цепочки выполняется инкремент 40 (DF=0) или декремент (DF=1) указателей DI и SI (при обработке байт – на единицу, при обработке слов – на два). Цепочечной команде может предшествовать специальный префикс повторения REP, который заставит МП повторить команду и модифициро- вать CX←CX+1. Операции повторяются, пока CX≠0. Перед командами сравнения CMPS и SCAS мнемоника префикса имеет вид REPZ/REPE или REPNZ/REPNE. Для REPZ примитив повторяется, покаCX≠0 или признак ZF=1, а для REPNZ – пока CX≠0 или ZF=0. Программы, приведенные в примерах 6.1 и 6.2 выполняют одно и то же действие – сравнивают строки, пока не будут просмотрены 100 элемен- тов или пока не встретятся совпадающие элементы. Пример 6.1. Найти совпадения mm1: cmpsb ;Сравнить [SI]–[DI], SI←SI+1, DI←DI+1 dec cx ; CX←CX-1 jnz mm1 ;Повторять, покаCX≠0 или FZ=0 Пример 6.2. Найти совпадения. repnz cmpsb ;Те же операции, что и в примере 6.1. Используя в примере 6.1 вместо JNZ другие команды условного пе- рехода, можно сравнивать элементы и по другим признакам, например по признаку “больше” или “меньше”. В примере 6.3 показана процедура копирования 10 элементов из строки STRING2 в строку STRING1. Пример 6.3. Копирование элементов строки ;Пусть цепочки находятся в сегменте данных string2 db ‘Петрова Н., Иванов А.’ ;Цепочка-источник string1 db 10 dup(?) ;Цепочка-приемник ;Процедура копирования copir proс push ds ;Заставить указывать pop es ;на сегмент данных cld ;Сброс для обработки слева направо lea si,string2 ;Адрес цепочки STRING2 в SI lea di,string1 ;Адрес цепочки STRING1 в DI mov cx,10 ;Число элементов в CX rep movsb ;Скопировать байты ret copir endp 6.3. Ввод строковых данных в ПЭВМ Значения элементов в строке можно задать с помощью директивы DB или DW. 41 При вводе строки с клавиатуры целесообразно пользоваться функци- ей DOS 0AH, вызываемой командой INT 21H. Чтобы воспользоваться ей, необходимо зарезервировать в сегменте данных место для строки. Напри- мер, оператор string db 64,65 dup(?) резервирует место для строки STRING, содержащей 64 элемента. Чтение строки с клавиатуры в память без изображения на экране производится командами, приведенными в примере 6.4. Пример 6.4. Чтение строки с клавиатуры lea dx, string ;Сделать DX указателем буфера mov ah,0ah ;Прочитать int 21h ;строку. Ввод завершить нажатием <ВК> После их выполнения в 1-м байте буфера STRING находится длина буфера 64, во 2-м – число фактически введенных символов. Элементы строки STRING+2 размещаются с 3-го байта. 6.4. Варианты заданий 1. Скопировать строку в обратном порядке. 2. Найти строку (список) с ключевым словом. 3. Найти в строке символ и заменить его. 4. Найти в строке символ «точка» и после нее заменить все элементы пробелами. 5. Найти в строке справа налево первый символ «;». Элементы, разме- щенные справа от ; , заменить пробелами. 6. Найти две одинаковые строки и одну из них заменить новой. 7. Составить из 3-х строк (слов) предложение. 8. Подсчитать число элементов в строке до символа ВК. 9. Определить в строке число полей, разделенных пробелами. Найти в строке комбинацию двух символов и заменить их. 6.5. Порядок выполнения работы 1. Изучите форматы цепочечных команд и примеры программ обработ- ки строк (пп. 6.2 - 6.3). 2. Разработайте для заданного варианта (п. 6.4.) программу обработки строк. Для более наглядного выполнения программы используйте проце- дуры ввода и изображения строк, приведенные в примере 6.4. 3. С помощью системных программ (см. работу 4) сформируйте исход- ный объектный и исполняемый модули. 4. Выполните программы в отладчике TD. 5. Выполните программу в DOS. 6.5. Содержание отчета 1. Программа для заданного варианта. 2. Результаты выполнения прграммы. 42 Библиографический список 1. Юров, В.И. Assembler [Текст]/ В.И. Юров.- Учебник для вузов.- 2-е издание.- СПб.: Питер, 2006.- 637 с.: ил.- ISBN: 5-94723-581-1 2. Юров, В.И. Assembler. Практика [Текст]/ В.И. Юров.- Учебник для вузов.- 2-е издание.- СПб.- Питер, 2006.- 399 с.: ил.- ISBN: 5-94723-671-0 3. Абель, П. Язык ассемблера для IBM PC и программирования [Текст]/П. Абель/ Пер. с англ. Ю.В. Сальникова.- М.: Высшая школа, 1992.-447 с., ил. 4. Пирогов, П.Ю. ASSEMBLER. Учебный курс [Текст]/ П.Ю. Пирогов.- М.: Издатель Молгачева С.В.- Нолидж, 2001.- 848 с.- ил.- ISBN: 5-89251-101-4 5. Микропроцессоры Intel 80х86. Архитектура и программирование: Методические указания к лабораторным работам / Рязан. гос. радиотехн. акад.; Сост. В.Н. Локтюхин. Рязань, 2007. 68 с. 43 СОДЕРЖАНИЕ Введение………………………………………………………………………. 1. Лабораторная работа 1………………….…………..................................... 3 3 2. Лабораторная работа 2..................…........................................................... 17 3. Лабораторная работа 3..............…............................................................... 26 4. Лабораторная работа 4........……................................................................. 31 5. Лабораторная работа 5...….......................................................................... 36 6. Лабораторная работа 6……………………………………………………. Библиографический список ………..……………………………………….. 39 42 Приложение. Система команд МП Intel 8086…............................................ 44 44 Приложение СИСТЕМА КОМАНД МП Intel 8086 При описании команд используются следующие обозначения: reg - один из РОН в соответствии со следующей таблицей: reg 000 010 100 110 W=1 AX DX SP SI W=0 AL DL AH DH reg 001 011 101 111 W=1 CX BX BP DI W=0 CL BL CH BH sreg 00 01 10 11 Сегм. рег. ES CS SS DS D - если D=l, то в reg, если D=0, то из reg; W - если W=l, то команда оперирует словом, - W=0, то - байтом; Х0- один байт данных. S:W = 01 - два байта данных, 11 - один байт данных, расширенный со знаком до 16 бит; V - если V=0, то счетчик равен 1, V=l - счетчик в CL; Z - применяется в цепочечных командах для сравнения с ZF; data L, data H - младшая и старшая часть (если W=l) непосредственного операнда; mod - поле режима адресации; r/m - при mod=11 интерпретируется как reg, при mod ≠ 11 определяет эффективный адрес (ЕА) операнда в памяти в соответствии со следующей таблицей, в которой disp L, disp H,L - 8- и 16-битные смещения в 3-м или в (3-4)-м бай- тах команды: mod r/m 00 01 10 000 001 010 011 100 101 110 111 (BX)+(SI) (BX)+(DI) (BP)+(SI) (BP)+(DI) (SI) (DI) disp H,L (BX) (BX)+(SI)+disp L (BX)+(DI)+disp L (BP)+(SI)+disp L (BP)+(DI)+disp L (SI)+disp L (DI)+disp L (BP)+disp L (BX)+disp L (BX)+(SI)+disp H,L (BX)+(DI)+disp H,L (BP)+(SI)+disp H,L (BP)+(DI)+disp H,L (SI)+disp H,L (DI)+disp H,L (BP)+disp H,L (BX)+disp H,L Команды передачи данных Команды 1-й байт 2-й байт 3-й байт 4-й байт MOV – передать Регистр или память в/из ре- гистра 100010DW mod reg r/m Непосредственный операнд в регистр или память 1100011W mod 000 r/m data L data H (W=1) 45 Непосредственный операнд в регистр (спецформат) 1011Wreg data L data H, (W=1) Память в аккумулятор (спецформат) 1010000W Мл. адрес EA ст. адрес EA Аккумулятор в память (спецформат) 1010001W Мл. адрес EA ст. адрес EA Регистр или память в регистр сегмента 10001110 mod 0 sreg r/m Регистр сегмента в регистр или память 10001100 mod 0 sreg r/m PUSH – включить в стек Регистр/память 11111111 mod 110 r/m Регистр (спецформат) 01010reg Регистр сегмента 000sreg110 POP – исключить Регистр/память из стека 10001111 mod 000 r/m Регистр (спецформат) 01011reg Регистр сегмента 000sreg111 XCHG – обменять Регистр/память с регистром 1000011W mod reg r/m Регистр с аккумулятором 10010reg IN – ввести из Фиксированного порта 1110010W Порт Переменного порта 1110110W OUT – вывести в Переменный порт 1110111W Фиксированный порт 1110110W Порт XLAT – передать байт в AL 11010111 LEA – загрузить EA в регистр 10001101 mod reg r/m LDS–загрузить указатель в DS 11000101 mod reg r/m LES–загрузить указатель в ES 11000100 mod reg r/m LAHF – загрузить в AH при- знаки 10011111 SAHF – запомнить AH в регистре признаков 10011110 PUSHF – включить признаки 10011100 POPF – исключить признаки 10011101 Команды арифметических операций Команды 1-й байт 2-й байт 3-й байт 4-й байт ADD – сложить Регистр/память с регистром 000000DW mod reg r/m 46 Непосредственный операнд c регистром/памятью 100000SW mod 000 r/m data L data H (SW=01) Непосредственный операнд с аккумулятором 0000010W data L data H, (w=1) ADC – сложить с переносом Регистр/память с регистром 000100DW mod reg r/m Непосредственный операнд c регистром/памятью 100000SW mod 010 r/m data L data H (SW=01) Непосредственный операнд с аккумулятором 0001010W data L data H, (w=1) INC – инкремент Регистра/памяти 1111111W mod 000 r/m Регистра 01000reg AAA – ASCII – коррекция сложения 00110111 DAA – десятичная коррекция сложения 00100111 SUB – вычесть Регистр/память с регистром 001010DW mod reg r/m Непосредственный операнд из регистра/памяти 100000SW mod 101 r/m data L data H (SW=01) Непосредственный операнд из аккумулятора 0010110W data L data H, (w=1) SBB – вычесть с заемом Регистр/память с регистром 000110DW mod reg r/m Непосредственный операнд из регистра/памяти 100000SW mod 011 r/m data L data H (SW=01) Непосредственный операнд из аккумулятора 0010110W data L data H, (w=1) DEC – декремент Регистр/память 1111111W mod 001 r/m Регистр 01001reg NEG – изменить знак 1111011W mod 011 r/m CMP - сравнить Регистр/память и регистр 001110DW mod reg r/m Непосредственный операнд c регистром/памятью 100000SW mod 111 r/m data L data H (SW=01) Непосредственный операнд с аккумулятором 0011110W data L data H, (w=1) AAS – ASCII коррекция вы- читания 00111111 DAS – десятичная коррекция вычитания 00101111 IMUL – умножение целых со знаком 1111011W mod 101 r/m 47 MUL – умножение без знака 1111011W mod 100 r/m AAM – ASCII – коррекция умножения 11010100 00 001 010 DIV – деление без знака 1111011W mod 110 r/m IDIV – деление со знаком 1111011W mod 111 r/m AAD – ASCII коррекция де- ления 11010101 00 001 010 CBW – преобразование байта в слово 10011000 CWD – преобразование сло- ва в двойное слово 10011001 Команды логических операций и сдвигов Команды 1-й байт 2-й байт 3-й байт 4-й байт NOT – инвертирование 1111011W mod 010 r/m SHL/SAL – сдвиг логиче- ский/арифм. влево 110100VW mod 100 r/m SHR – сдвиг логич. вправо 110100VW mod 101 r/m SAR – сдвиг арифм. вправо 110100VW mod 111 r/m ROL – сдвиг цикл. влево 110100VW mod 000 r/m ROR – сдвиг цикл. вправо 110100VW mod 001 r/m RCL – сдвиг цикл. влево 110100VW mod 010 r/m RCR – сдвиг цикл. вправо через перенос 110100VW mod 011 r/m AND – коньюнкция И Регистр/память с регистром 001000DW mod reg r/m Непосредственный операнд c регистром/памятью 1000000W mod 100 r/m data L data H (W=1) Непосредственный операнд с аккумулятором 0010010W data L data H (W=1) TEST – И без записи результ. Непосред. операнд с аккум. 1010100DW data L data H Регистр/память с регистром 1000010W mod reg r/m Непосредственный операнд c регистром/памятью 1111011W mod 000 r/m data L data H (W=1) OR – дизьюнкция ИЛИ Регистр/память с регистром 000010DW mod reg r/m Непосредственный операнд c регистром/памятью 1000000W mod 001 r/m Непосредственный операнд с аккумулятором 0000110W data L data H (W=1) XOR – ИЛИ исключающее Регистр/память с регистром 001100DW mod reg r/m Непосредственный операнд c регистром/памятью 1000000W mod 001 r/m data L data H (W=1) Непосредственный операнд с 0011010W data L data H 48 аккумулятором (W=1) Команды операций с цепочками данных Команды 1-й байт REP - повторить 1111001Z MOVS – передать байт/слово: [DI] ← [SI] 1010010W CMPS – сравнить байт/слово: [DI] ← [SI] 1010011W SCAS – сканировать байт/слово: асс ← [DI] 1010111W LODS – загрузить байт/слово из [SI] в AL/AX 1010110W STOS – запомнить байт/слово из AL/AX в[DI] 1010101W Команды передачи управления (безусловные) Команды 1-й байт 2-й байт 3-й байт CALL – ВЫЗОВ Прямой в сегменте 11101000 Мл. смещ. Ст. смещ. Косвенный в сегменте 11111111 mod 010 r/m Прямой межсегментный 10011010 Мл. смещ. Ст. смещ. Мл. сег. (4-й байт) Мл.сег.(5-й байт) Косвенный межсегментный (mod ≠ 11) 11111111 mod 011 r/m JMP – БЕЗУСЛ. ПЕРЕХОД Прямой в сегменте 11101001 Мл. смещ. Ст. смещ. Прямой в сегменте короткий 11101011 Смещение Косвенный в сегменте 11111111 mod 100 r/m Прямой межсегментный 11101010 Мл. смещ. Ст. смещ. Мл. сег.(4-й байт) Мл.сег.(5-й байт) Косвенный межсегментный (mod ≠ 11) 11111111 mod 101 r/m RET – ВОЗВРАТ В сегменте со слож. непо- средст. операнда с SP 11000010 data L data H В сегменте 11000010 Межсегментный 11001011 Межсегментный со слож. непосредст. операнда с SP 11001010 data L data H Команды условных переходов и циклов Команды Условие JA/JNBE CF ∪ ZF=0 > 77 Смещ. Перейти, если выше * /не ниже или равно JNC/JAE/JNB CF=0 >= 73 Смещ. Выше или равно/ не ниже (нет переноса) JC/JB/JNAE CF=1 < 72 Смещ. Ниже/не выше или равно (есть перенос) JBE/JNA CF ∪ ZF=1 <= 76 Смещ. Ниже или равно/не выше 49 JE/JZ ZF=1 = 74 Смещ. Равно/нуль JG/JNLE (SF+OF)ZF=0 > 7F Смещ. Больше * /не меньше и = JGE/JNL SF+OF=0 >= 7D Смещ. Больше или равно/не меньше JL/JNGE SF+OF=1 < 7C Смещ. Меньше/не больше или равно JLE/JNG (SF+OF)ZF=1 <= 7E Смещ. Меньше или равно/не рав- но JNZ/JNE ZF=0 75 Смещ. Не равно/не нуль JNO OF=0 71 Смещ. Нет переполнения JNP/JPO PF=0 7B Смещ. Нет паритета/паритет не- четный JNS SF=0 79 Смещ. Нет знака (отрицание) JO OF=1 70 Смещ. Есть переполнение JP/JPE PF=1 7A Смещ. Есть паритет/паритет чет- ный JS SF=1 78 Смещ. Есть знак (отрицательный) JCNX (CX)=0 E3 Смещ. Содержение регистра CX=0 LOOP (CX) ≠ 0 E2 Смещ. Зациклить CX раз LOOPZ/LOOPE (CX) ≠ 0, ZF=1 E1 Смещ. Зациклить до нуля/равно LOOPNZ/LOOPNE (CX) ≠ 0, ZF=0 E0 Смещ. Зацикл. до нуля/не равно * Термины “больше”, “меньше” относятся к знаковым числам, представленным в ДК, а “выше”, “ниже” – к беззнаковым. Команды прерывания Команды 1-й байт 2-й байт INT - прерывание 11001101 Тип INT 3 – прерывание типа 3 11001100 INTO – прерывание по переп. 11001110 IRET – возврат из прерывания 11001111 Команды управления микропроцессором Команды 1-й байт 2-й байт CLC – сброс переноса 11111000 CMC – дополнение переноса 11110101 STC – установка переноса 11111001 STD – установка направления 11111101 CLD – сброс направления 11111100 CLI – брос прерываний 11111010 STI – установка прерываний 11111011 HLT – останов 11110100 WAIT – ожидание 10011011 ESC – обращение к сопроцес. 11011xxx mod yyy r/m LOCK – префикс блокировки 11110000 Префикс замены сегмента: 001sreg110 50 Учебное издание Чернов Андрей Владимирович Тишина Анджела Викторовна АРХИТЕКТУРА ИНФОРМАЦИОННЫХ СИСТЕМ Учебно-методическое пособие для выполнения лабораторных и практических работ Часть 1 Микропроцессоры INTEL 80X86 «Электронный университет» ФГБОУ ВО РГУПС Адрес университета: 344038, Ростов н/Д, пл. Ростовского Стрелкового Полка Народного Ополчения, 2. |