Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Module_1_answers_with_practice.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3.55 Mб
Скачать

1 Задача

  1. Записать в порт 43h белиберду примерно следующего содержания

1011х110 (10 - выбор 2 канала; 11 - запись значения в счетчик в формате сначала младшего, потом старшего байта; х11 - режим 3; 0 - двоичный счет - не знаю, зачем он нужен)

  1. Вставить начальное значение счетчика в порт 40h: сначала младший байт, потом старший. Поскольку на входе железно значение 1.193 МГц, а на выходе - 1193 Гц, значит, начальное значение было 1000 (в 10 системе), или в виде 2 байт:

00000011 11101000

Почему именно 1000? Потому что в режиме 3 выходная частота = частота входного сигнала / значение счетчика. В остальных режимах (кроме 2-го) ерунда всякая

  1. Установить 2 младших разряда порта 61h в 1 - разрешение генерации звука

2 Задача

http://www.e-zine.excode.ru/online/3/syscall.html

C8 0D 36 12 00 80 20 00:

11001000 00001101 00110110 00010010 00000000 10000000 00100000 00000000

Limit (0 – 15): 00100000 00000000

Base(16 – 39): 00010010 00000000 10000000

Доступ: (40-47): 00110110

(P=0 – сегмент не загружен в память; DPL=01 – третий приоритет; S=0 – несистемный дескриптор; ED=1 – сегмент стека; W=1 – доступен для записи; A=0)

Limit: 1101

Attributes: 0000

(G=0 – макс. Размер сегмента - 220; D/B=0 – 16-разрядный сегмент; AVL=0 – свободный бит)

Base: 11001000

3 задача

IEEE 754

Судя по непонятной характеристике в 11 бит, самое похожее, что я нашел, было Double Precision. В нем 11 бит идет на экспоненту, 52 бита на мантиссу.

http://www.binaryconvert.com/result_double.html?decimal=045048046052053

4 задача

Коротка відповідь:

регістри: DS, SI, ES, DI, AX, CX

адреси всіх двобайтних слів:

перша область - А000:0010 А000:0012 А000:0014 А000:0016 А000:0018 А000:001А А000:001C А000:001D А000:001F А000:0020

друга область - В000:0020 В000:0022 В000:0024 В000:0026 В000:0028 В000:002A В000:002C В000:002D В000:002F В000:0030

Розгорнута відповідь:

Для того щоб записати дані з одної комірки памяті в іншу використовується команда MOVSB(копіює 1 байт), MOVSW(копіює 2 байта, тобто слово), MOVSD(копіює 4 байта, тобто 2 слова; ця команда доступна тільки на процесорі 386). Ці команди не мають аргументів, і використовують регістри процесора DS, SI, ES, DI для того щоб дізнатись що куди копіювати. Комірка памяті з якої необхідно копіювати розраховується як DS:SI (DS - сегмент, SI - зміщення), комірка в яку треба копіювати як ES:DI (ES - сегмент, DI - зміщення). Крім цього значення регістрів SI та DI будуть збільшуватись(коли у флаговому регістрі DF=0), або зменшуватись (при DF=1) на 1,2 чи 4(в залежності від того яка саме з команд MOVSB/MOVSW/MOWSD використовуєтсья). Оскільки в регістри DS та ES не можна напряму записати значення (а можна лише скопіювати з іншого регістра), то необхідно використовувати проміжний регістр AX. Крім цього всього зручно буде використвти регістр CX для того щоб вказати скільки разів виконувати команду MOVSB/MOVSW/MOWSD.

Програма може бути якась така:

mov ax,0xA000 ;будемо копіювати з сегмента A000

mov ds,ax

mov ax,0xB000 ;будемо копіювати в сегмент B000

mov es,ax

mov si,0x0010 ;зміщення в сегменті A000 буде 0010 (комірка памяті А000:0010)

mov di,0x0020 ;зміщення в сегменті В000 буде 0020 (комірка памяті В000:0020)

mov cx,0xA    ;визначаємо, що операція movsw буде виконуватись 10 раз (так як 10 раз по 2 байти дасть якраз 20 байт)

rep movsw

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]