
- •В.А. Афанасьев
- •Часть 1 Лабораторный практикум
- •Предисловие
- •1. Краткая характеристика операционной среды ms-dos в компьютерах с операционной системой Windows
- •2. Составные части ms-dos и её инициализация
- •3. Взаимодействие Ассемблерной программы с ms-dos и аппаратными средствами Компьютера
- •4. Сегментированная организация памяти в реальном режиме. Виды памяти в среде ms-dos
- •Распределение первого мегабайта памяти компьютера
- •Содержание некоторых полей области данных bios
- •5. Программная модель 32-разрядных процессоров i80x86
- •Назначения сегментных регистров
- •6.2.2. Путь выполнения команды
- •6.2.3. Трансляция программы. Опции командной строки
- •6.2.4. Структура программы для .Exe- и .Com-файлов. Образ программы в памяти
- •Сегменты упрощенной модели памяти Small
- •%Title "Имя exe-файла программы"
- •%Title "Имя com – файла программы"
- •6.2.5. Работа с отладчиком Turbo Debugger (td)
- •6.2.6. Форматы машинных команд и их кодирование
- •Определение эффективного адреса
- •Косвенные виды адресации
- •6.2.6.2. Использование 32-битных регистров
- •6.2.7. Работа над синтаксическими ошибками при ассемблировании программы
- •6.3. Задание к работе. Порядок выполнения
- •6.4. Контрольные вопросы
- •Приложения к лабораторной работе № 1 п.1.1. Машинные коды команд базового процессора i8086
- •Машинные коды команд базового процессора i8086
- •П.1.2. Демонстрационные файлы
- •П.1.3. Форматы исполняемых файлов .Exe и .Com на диске
- •А) Листинг prog_com. Lst
- •Содержимое префикса программы psp
- •А) Листинг prog_exe.Lst
- •Б) Машинный код исполняемого файла prog_exe.Exe на диске объёмом 624 байта
- •Формат заголовка исполняемого .Exe – файла на диске
- •7.2.2. Ввод с клавиатуры символьной информации
- •7.2.2.1. Буфер ввода данных с клавиатуры
- •7.2.2.2. Системные функции dos ввода данных с клавиатуры
- •Сравнительная характеристика функций dos ввода с клавиатуры
- •7.2.3. Функции dos вывода данных на экран
- •7.2.4. Расширенные коды ascii и управление программой с клавиатуры
- •Расширенные коды для функциональных клавиш
- •7.2.5. Строковые команды. Общая характеристика
- •Команды обработки строк
- •7.3. Задания к работе. Подготовка и выполнение
- •7.4. Контрольные вопросы
- •Приложения к лабораторной работе № 2 Приложение п.2.1. Примеры реализаций типового задания
- •Приложение п.2.2. Esc-последовательности
- •Параметры Esc-последовательности
- •Приложение п.2.3. Таблица символов в кодировке ascii
- •8.2.2. Прямое программирование видеобуфера в текстовом режиме
- •8.2.3. Справочные данные по функциям bios
- •8.2.3.1. Прерывание int 10h. Видеофункции bios
- •Текстовые видеорежимы и страницы в стандарте vga, поддерживаемые современными видеоконтроллерами
- •8.2.3.2. Рекомендации по использованию видеосервиса bios
- •8.2.3.3. Прерывание int 16h
- •8.2.3.4. Задержка программных операций
- •Int 15h, функция 86h
- •8.3. Варианты индивидуального задания
- •8.4. Контрольные вопросы
- •Приложения к работе № 3 Примеры реализаций типовых заданий п.3.1. Листинг 3.4. Программа получения скан-кодов клавиш клавиатуры
- •П.3.2. Листинг 3.5. Демонстрационная программа использования функций bios для работы с экраном и клавиатурой
- •9.2.1. Представление знаковых и беззнаковых чисел в 16-разрядном компьютере
- •Представление чисел в 16- разрядном компьютере
- •9.2.2. Преобразование ascii-кодов чисел с произвольным основанием в двоичное число
- •9.2.3. Преобразование двоичного числа в ascii-строку числа по произвольному основанию
- •9.2.4. Задание к работе. Порядок выполнения
- •Варианты заданий 1-7
- •Варианты заданий 8-14
- •9.2.5. Вопросы построения многомодульных программ
- •9.2.6. Ассемблирование и компоновка отдельных модулей в программу. Создание библиотеки объектных модулей
- •9.3. Контрольные вопросы
- •Список использованной и рекомендуемой Литературы
- •Оглавление
6.4. Контрольные вопросы
Запишите команду для ассемблирования файла f_1.asm с учётом формирования листинга и возможности использования отладчика TD.
Запишите команду для компоновки файла f_1.obj, разрешающую использование отладчика и запрещающего создание файла отображения.
Как определить физический объект в сегментированной модели памяти, если известны его логические компоненты: "Segment – Offset"?
Запишите директивы языка ассемблера, управляющие сегментами стека, данных и кода в режиме Ideal (Masm).
В чём состоит принципиальная разница между исполняемыми файлами программ типа .exe и .com
Запишите команды, определяющие начало и конец программного кода.
В чём состоит различие между ошибками и предупреждениями, создаваемыми Tasm во время трансляции? Ваши действия при обнаружении ошибки.
После загрузки программы в TD требуется инициализировать сегментный регистр ds на начало сегмента данных. Изложите последовательность ваших действий.
Опишите основные форматы команд 16-разрядных процессоров.
Изложите состав и назначение полей постбайта (байта адресации) в двухоперандной команде процессора.
Укажите на основные отличия в механизме адресации 16- и 32-разрядных процессоров.
Какие из приведённых ниже команд записаны с ошибками и почему? Считайте все идентификаторы переменными, которые определены как слова в сегменте данных:
mov bp,al
mov [op_1+bx+di+12],ax
mov [op_1],[op_2]
mov ax,[op_3+dx]
mov cs,ax
mov [bx+si],2
lea bx,op_2
mov bx,offset [op_2]
Приложения к лабораторной работе № 1 п.1.1. Машинные коды команд базового процессора i8086
В табл. П.1.1_1 использованы следующие обозначения: r – общий регистр; sr – сегментный регистр; m – адрес ячейки памяти, который указывается в мнемокоде в соответствии с используемым способом адресации; Acc – аккумулятор AH или AL; port – адрес 8-pазpядного порта ввода-вывода; type – тип (вектор) прерывания; disp 8/16 – смещение в формате команды (один или два байта); D8/16 – одно или двухбайтная константа; sbr – имя подпрограммы; diff – разница между адресом перехода и содержимым указателя команд IP; label – метка, к которой осуществляется переход; opcode – команда для сопроцессора. Постбайт (второй байт B2 в табл. П.1.1_1.) состоит из трех полей: md – режим, reg – регистр, r/m – регистр/память.
Таблица П.1.1_1
Машинные коды команд базового процессора i8086
Команда |
Байты кода команды |
Содержание операции |
||
В1 |
В2 |
В3-В6 |
||
ния AAA |
00110111 |
|
|
|
2. ASCII-коррекция для деления |
|
|
|
|
AAD |
11010101 |
00001010 |
|
|
3. ASCII-коррекция для умножения AAM |
11010100 |
00001010 |
|
|
4. ASCII-коррекция для вычитания AAS |
00111111 |
|
|
|
Продолжение табл. П.1.1_1
Команда |
Байты кода команды |
Содержание операции |
||
В1 |
В2 |
В3-В6 |
||
5. Сложение с учётом переноса |
|
|
|
|
ADC r, r/m |
0001001w |
md reg r/m |
(disp8/16) |
rr+ r/m+ CF |
r/m, r |
0001000w |
md reg r/m |
(disp8/16) |
r/mr+ r/m+ CF |
r/m, d |
1000000w |
md 010r/m |
(disp8/16)d8/16 |
r/mr+ r/m+ CF |
r16/m16,d8 |
10000011 |
md 010r/m |
data L |
r/mr/m+ d+ CF |
acc, d |
0001010w |
data L |
(data H) |
accacc +d+ CF |
6. Сложение |
|
|
|
|
ADD r, r/m |
0000001w |
md reg r/m |
(disp8/16) |
rr+ r/m |
r/m, r |
0000000w |
md reg r/m |
(disp8/16) |
r/mr +r/m |
r/m, d |
1000000w |
md 000r/m |
(disp8/16)d8/16 |
r/mr/m +d |
r16/d16,d8 |
10000011 |
md000r/m |
data L |
r/mr/m +d |
acc, d |
0000010w |
data L |
(data H) |
accacc +d |
7. Логическое И |
|
|
|
|
And r, r/m |
0010001w |
md reg r/m |
(disp8/16) |
rr r/m |
r/m, r |
0010000w |
md reg r/m |
(disp8/16) |
r/mr r/m |
r/m, d |
1000000w |
md 100 r/m |
data L (data H) |
r/mr/m d |
acc, d |
0010010w |
data L |
(data H) |
acc acc d |
8. Вызов подпрограммы |
|
|
|
|
Call near sbr |
11101000 |
diff L |
diff H |
IPIP+ diff |
near r16/m16 |
11111111 |
md 010 r/m |
(disp8/16) |
IPIP+ r/m |
far sbr |
10011010 |
ip-L |
ip-H, cs-L, cs-H |
|
far m32 |
11111111 |
md 011 r/m |
(disp8/16) |
CS,IPm32 |
9. Преобразование байта в слово |
|
|
|
|
CBW |
10011000 |
|
|
|
10. Сброс флага переноса CLC |
11111000 |
|
|
CF0 |
11. Сброс флага направления |
|
|
|
|
CLD |
11111100 |
|
|
DF0 |
12. Сброс флага прерывания |
|
|
|
|
CLI |
11111010 |
|
|
IF0 |
13. Инверсия флага переноса |
|
|
|
|
CMC |
11110101 |
|
|
CF = !CF |
14. Сравнение |
|
|
|
|
CMP r,r/m |
0011101w |
md reg r/m |
(disp8/16) |
r-r/m |
r/m,r |
0011100w |
md reg r/m |
(disp8/16) |
r/m-r |
r/m,d |
1000000w |
md 111 r/m |
(disp8/16)d8/16 |
r/m-d |
r16/m16,d8 |
10000011 |
md 111 r/m |
data L |
r/m-d |
|
0011110w |
data L |
(data H) |
acc-d |
15. Сравнение строк |
|
|
|
|
CMPS dst,src |
1010011w |
|
|
[ds:si]-[es:di] |
16. Преобразование слова в двойное слово CWD |
10011001 |
|
|
|
17. Десятичная коррекция сложе-ния DAA |
00100111 |
|
|
|
18. Десятичная коррекция вычи- тания DAS |
00101111 |
|
|
|
Продолжение табл. П.1.1_1
Команда |
Байты кода команды |
Содержание операции |
||
В1 |
В2 |
В3-В6 |
||
19. Декремент |
|
|
|
|
DEC r/m |
1111111w |
md 001 r/m |
(disp8/16) |
r/mr/m-1 |
r |
01001 reg |
|
|
rr-1 |
20. Деление чисел без знака |
|
|
|
|
DIV r/m |
1111011w |
md 110 r/m |
(disp8/16) |
|
21. Переключение на сопроцессор EXC OPCODE, r/m |
11011xxx |
md 001 r/m |
(disp8/16) |
|
22. Останов HLT |
11110100 |
|
|
|
23. Деление чисел со знаком |
|
|
|
|
IDIV r/m |
1111011w |
md 111 r/m |
(disp8/16) |
|
24. Умножение чисел со знаком |
|
|
|
|
IMUL r/m |
1111011w |
md 101 r/m |
(disp8/16) |
|
25. Ввод из порта |
|
|
|
|
Прямой IN acc,port |
1110010w |
port8 |
|
|
Косвенный IN acc,dx |
1110110w |
|
|
|
26. Инкремент |
|
|
|
|
INC r/m |
1111111w |
md 000 r/m |
(disp8/16) |
r/mr/m+1 |
r |
01000 reg |
|
|
rr+1 |
27. Прерывание заданного типа |
|
|
|
|
INT type |
11001101 |
type |
|
|
Прерывание по переполнению INTO |
11001110 |
|
|
|
Прерывание типа 3 (INT3) |
11001100 |
|
|
|
28. Возврат из прерывания |
|
|
|
|
IRET |
11001111 |
|
|
|
29. Переход, если выше |
|
|
|
CFZF=0 |
JA label |
01110111 |
diff L |
|
IPIP+diff L |
30. Переход, если выше или равно JAE ladel |
01110011 |
diff L |
|
CF=0 IPIP+diffL L |
31. Переход, если ниже |
|
|
|
CF=1 |
JB ladel |
01110010 |
diff L |
|
IPIP+diff L |
32. Переход, если ниже или равно |
|
|
|
CFZF=1 |
JBE label |
01110110 |
diff L |
|
IPIP+diff L |
33. Переход, если есть перенос |
|
|
|
CF=1 |
JC label |
01110010 |
diff L |
|
IPIP+diff L |
34. Переход, если СX=0 |
|
|
|
|
JCXZ label |
11100011 |
diff L |
|
IPIP+diff L |
35. Переход, если равно |
|
|
|
ZF=1 |
JE/JZ label |
01110100 |
diff L |
|
IPIP+diff L |
36. Переход, если больше |
|
|
|
(SFOF)ZF=0 |
JG label |
01111111 |
diff L |
|
IPIP+diff L |
|
|
|
|
|
37. Переход, если больше или равно JGE label |
01111101 |
diff L |
|
SFOF=0 IPIP+diff L |
38. Переход, если меньше |
|
|
|
SFOF=1 |
JL label |
01111100 |
diff L |
|
IPIP+diff L |
Продолжение табл. П.1.1_1
Команда |
Байты кода команды |
Содержание операции |
||
В1 |
В2 |
В3-В6 |
||
39. Переход, если меньше или = |
|
|
|
(SFOF)ZF=1 |
JLE label |
01111110 |
diff L |
|
IPIP+diff L |
40. Безусловный переход |
|
|
|
|
JMP short label |
11101011 |
diff L |
|
IPIP+diff L |
near label |
11101001 |
diff L |
diff H |
IPIP+diff 16 |
near r16/m16 |
11111111 |
md 100 r/m |
(disp8/16) |
IPIP+r/m |
far label |
11101010 |
ip-l |
ip-h, cs-l, cs-h |
|
far m32 |
11111111 |
md 101 r/m |
(disp8/16) |
CS,IPm32 |
41. Переход, если нет переноса |
|
|
|
CF=0 |
JNC label |
01110011 |
diff L |
|
IPIP+diff L |
42. Переход, если не равно |
|
|
|
ZF=0 |
JNE/JNZ |
01110101 |
diff L |
|
IPIP+diff L |
43. Переход, если нет перепол- нения JNO label |
01111001 |
diff L |
|
OF=0 IPIP+diff L |
44. Переход, если нет паритета |
|
|
|
PF=0 |
JNP label |
01111011 |
diff L |
|
IPIP+diff L |
45. Переход, если SF=0 |
|
|
|
|
JNS label |
01111001 |
diff L |
|
IPIP+diff L |
46. Переход, если есть перепол- нение JO label |
01110000 |
diff L |
|
OF=1 IPIP+diff L |
47. Переход, если есть паритет |
|
|
|
PF=1 |
JP label |
01111010 |
diff L |
|
IPIP+diff L |
48. Переход, если паритет нечёт- ный JPO label |
01111011 |
diff L |
|
PF=0 IPIP+diff L |
49. Переход, если SF=1 |
|
|
|
|
JS label |
01111000 |
diff L |
|
IPIP + diff L |
50. Загрузка младшего байта FL в регистр AH LAHF |
10011111 |
|
|
AHFL |
51. Загрузка указателя адреса |
|
|
|
|
LDS r16, m32 |
11000101 |
md reg r/m |
(disp8/16) |
r,dsm32 |
52. Загрузка эффективного адреса |
|
|
|
|
LEA r16,m |
10001101 |
md reg r/m |
(disp8/16) |
rEA |
53. Загрузка указателя адреса |
|
|
|
|
LES r16,m32 |
11000100 |
md reg r/m |
(disp8/16) |
r,esm32 |
54. Загрузка элемента строки |
|
|
|
|
LODS src |
1010110w |
|
|
acc [ds:si] |
55. Зациклить LOOP label |
11100010 |
diff L |
|
IPIP+diff L |
56. Зациклить, если равно |
|
|
|
(cx≠0)&(zf=1) |
LOOPE/LOOPZ label |
11100001 |
diff L |
|
IPIP+diff L |
57. Зациклить если не равно |
|
|
|
(cx≠0)&(zf=0) |
LOOPNE/LOOPNZ label |
11100000 |
diff L |
|
IPIP+diff L |
Продолжение табл. П.1.1_1
Команда |
Байты кода команды |
Содержание операции |
||
В1 |
В2 |
В3-В6 |
||
58. Пересылка |
|
|
|
|
MOV r,r/m |
1000101w |
md reg r/m |
(disp8/16) |
rr/m |
r/m,r |
1000100w |
md reg r/m |
(disp8/16) |
r/mr |
r/m,d |
1100011w |
md 000r/m |
(disp8/16) d8/d16 |
r/md |
r,d |
1011w reg |
data L |
(data H) |
rd |
acc,m |
1010000w |
disp L |
disp H |
accm |
m,acc |
1010001w |
disp L |
disp H |
macc |
sr,r/m |
10001110 |
md 0sr r/m |
(disp 8/16) |
srr/m |
r/m, sr |
10001100 |
md 0sr r/m |
(disp 8/16) |
r/msr |
59. Передача элемента строки |
|
|
|
|
MOVS dst,src |
1010010w |
|
|
[es:di][ds:si] |
60. Умножение чисел без знака |
|
|
|
|
MUL r/m |
1111011w |
md 100 r/m |
(disp 8/16) |
|
61. Изменение знака числа |
|
|
|
|
NEG r/m |
1111011w |
md 011 r/m |
(disp 8/16) |
r/m 0-r/m |
62. Пустая операция NOP |
10010000 |
|
|
|
63. Логическое НЕ NOT |
1111011w |
md 010 r/m |
(disp8/16) |
|
64. Логическое ИЛИ |
|
|
|
|
or r,r/m |
0000101w |
md reg r/m |
(disp8/16) |
rr r/m |
r/m,r |
0000100w |
md reg r/m |
(disp8/16) |
r/mr/m r |
r/m,d |
1000000w |
md 001 r/m |
(disp8/16) d8/16 |
r/mr/rm d |
acc,d |
0000110w |
data L |
(data H) |
accacc d |
65. Вывод в порт |
|
|
|
|
Прямой Out acc,port |
1110011w |
port 8 |
|
|
Косвенный Out acc,dx |
1110111w |
|
|
|
66. Чтение из стека POP r/m |
10001111 |
md 110 r/m |
(disp8/16) |
|
r |
01011reg |
|
|
|
sr |
000sr111 |
|
|
|
67.Чтение флагов из стека POPF |
10011101 |
|
|
|
|
|
|
|
|
68. Запись в стек PUSH r/m |
11111111 |
md 110 r/m |
(disp8/16) |
|
r |
01010 reg |
|
|
|
sr |
000 sr 110 |
|
|
|
69. Запись регистра флагов в стек |
|
|
|
|
PUSHF |
10011100 |
|
|
|
70. Циклический сдвиг влево через CF RCL r/m,1 |
1101000w |
md 010 r/m |
(disp8/16) |
|
r/m,CL |
1101001w |
md 010 r/m |
(disp8/16) |
|
71.Циклический сдвиг вправо через CF RCR r/m,1 |
1101000w |
md 011 r/m |
(disp8/16) |
|
r/m,CL |
1101001w |
md 011 r/m |
(disp8/16) |
|
Продолжение табл. П.1.1_1
Команда |
Байты кода команды |
Содержание операции |
||
В1 |
В2 |
В3-В6 |
||
72. Возврат из подпрограммы |
|
|
|
|
RET (near) |
11000011 |
|
|
ip←(ss:sp) |
RET (far) |
11001011 |
|
|
ip←(ss:sp) cs←(ss:sp+2) |
Возврат с прибавлением числа d |
|
|
|
|
d=2k, где 2к-число параметров RET d (near) |
11000010 |
data L |
data H |
ip←(ss:sp) sp=sp+d |
RET d (far) |
11001010 |
data L |
data H |
ip←(ss:sp) cs←(ss:sp+2) sp=sp+d |
73. Циклический сдвиг влево |
|
|
|
|
ROL r/m,1 |
1101000w |
md 000 r/m |
(disp8/16) |
|
r/m,CL |
1101001w |
md 001 r/m |
(disp8/16) |
|
74. Циклический сдвиг вправо |
|
|
|
|
ROR r/m,1 |
1101000w |
md 001 r/m |
(disp8/16) |
|
r/m,CL |
1101001w |
md 001 r/m |
(disp8/16) |
|
75. Пересылка АН в регистр флагов SAHF |
10011110 |
|
|
|
76. Арифметический (логический) сдвиг влево |
|
|
|
|
SAL/SHL r/m,1 |
1101000w |
md 100 r/m |
(disp8/16) |
|
r/m,CL |
1101001w |
md 100 r/m |
(disp8/16) |
|
77. Арифметический сдвиг впра- во SAR r/m,1 |
1101000w |
md 111 r/m |
(disp8/16) |
|
r/m,CL |
1101001w |
md 111 r/m |
(disp8/16) |
|
78. Вычитание с заёмом |
|
|
|
|
SBB r,r/m |
0001101w |
md reg r/m |
(disp8/16) |
rr-r/m-CF |
r/m,r |
0001100w |
md reg r/m |
(disp8/16) |
r/mr-r/m-CF |
r/m,d |
1000000w |
md 011 r/m |
(disp8/16) |
r/mr/m-d-CF |
r16/m16,d8 |
10000011 |
md 011 r/m |
(disp8/16) |
r/mr/m-d-CF |
acc,d |
0001110w |
data L |
data H |
accacc-d-CF |
79. Сканировать элемент строки |
|
|
|
|
SCAS dst |
1010111w |
|
|
acc-[es:di] |
80. Логический сдвиг влево SHL r/m,1 r/m,cl |
1101000w 1101001w |
md 100 r/m md 100 r/m |
(disp 8/16) (disp 8/16) |
|
81. Логический сдвиг вправо |
|
|
|
|
SHR r/m,1 |
1101000w |
md 101 r/m |
(disp8/16) |
|
r/m,cl |
1101001w |
md 101 r/m |
(disp8/16) |
|
82. Установка флага cf STC |
11111001 |
|
|
CF=1 |
83.Установка флага направления |
|
|
|
|
STD |
11111101 |
|
|
DF=1 |
84. Установка флага прерывания |
|
|
|
|
STI |
11111011 |
|
|
IF=1 |
85. Сохранение Aсc в строке |
|
|
|
|
STOS dst |
1010101w |
|
|
es:diacc |
Окончание табл. П.1.1_1
Команда |
Байты кода команды |
Содержание операции |
||
В1 |
В2 |
В3-В6 |
||
86. Вычитание |
|
|
|
|
SUB r,r/m |
0010101w |
md reg r/m |
(disp8/16) |
rr-r/m |
r/m,r |
0010100w |
md reg r/m |
(disp8/16) |
r/mr-r/m |
r/m,d |
1000000w |
md 101 r/m |
(disp8/16) d8/16 |
r/mr/m-d |
r16/m16,d8 |
10000011 |
md 101 r/m |
data L |
r/mr/m-d |
acc,d |
0010110w |
data L |
(data H) |
accacc-d |
87.Проверка (неразрушающее И) |
|
|
|
|
TEST r,r/m |
1000010w |
md reg r/m |
(disp8/16) |
rr/m |
r/m,d |
1111011w |
md 000 r/m |
(disp8/16) d8/16 |
r/md |
acc,d |
1010100w |
data L |
(data H) |
accd |
88. Ожидание WAIT |
00111011 |
|
|
|
89. Обмен XCHG ax,r |
10010 reg |
|
|
axr |
r,ax |
10010 reg |
|
|
rax |
r,r/m m,r |
1000011w 1000011w |
md reg r/m md reg r/m |
(disp 8/16) (disp 8/16) |
rr/m mr |
90. Табличная трансляция XLAT |
11010111 |
|
|
|
91. Исключающее ИЛИ |
|
|
|
|
xor r,r/m |
0011001w |
md reg r/m |
(disp 8/16) |
rr r/m |
r/m,r |
0011000w |
md reg r/m |
(disp 8/16) |
r/mr r/m |
r/m,d |
1000000w |
md 100 r/m |
(disp 8/16) d8/16 |
r/mr/m d |
acc,d |
0011010w |
data L |
(data H) |
accacc d |
Префикс блокировки шины LOCK |
11110000 |
|
|
|
Повторять строковую операцию |
|
|
|
|
REP/REPE/REPZ |
11110011 |
|
|
|
REPNE/REPNZ |
11110010 |
|
|
|
Префикс замены сегмента SEG |
001 sr 110 |
|
|
|