Мова програмування Assembler
Методическое пособие - Компьютеры, программирование
Другие методички по предмету Компьютеры, программирование
ама програма, адресний проміжок, який виділяється їй для динамічних змінних, а також набір та значення системних змінних.
Системною змінною називається такий спеціальний іменований параметр, який існує в операційній системі протягом її роботи, і який задає певне значення, критичне для її роботи, або роботи якоїсь програми.
2. PSP та отримання доступу до командної стрічки
Префікс програмного сегмента (PSP) займає 256 (тичина 100) байт і завжди передує в памяті кожної COM- чи EXE-програмі, що повинна бути виконана. PSP містить наступні поля:
00 Команда INT 20H (тичина.CD20).
02 Загальний розмір доступної памяті у форматі хххх0. Наприклад, 512K вказується як 8000 замість 80000.
04 Зарезервовано.
05 Довгий виклик диспетчера функцій DOS.
OA Адреса підпрограми завершення.
OE Адреса підпрограми реакції на Ctrl/Break.
12 Адреса підпрограми реакції на фатальну помилку.
16 Зарезервовано.
2C Сегментна адреса середовища для збереження ASCIIZ рядків.
50 Виклик функцій DOS (INT 21H і RETF).
5C Параметрична область 1, форматована як стандартний невідкритий блок керування файлів (FCB№1).
6C Параметрична область 2, форматована як стандартний невідкритий блок керування файлім (FCB№2); перекривається, якщо блок FCB№1 відкритий.
80-FF Буфер передачі даних (DTA).
Буфер передачі даних DTA
Дана частина PSP починається за адресою тичина.80 і являє собою буферну область уведення-висновку для поточного дисковода. Вона містить у першому байті число, що вказує скільки разів були натиснуті клавіші на клавіатурі безпосередньо після введення імені програми. Починаючи з другого байта, знаходяться введені символи (якщо такі існують). Далі випливає всіляке "сміття", що залишилося в памяті після роботи попередньої програми. Наступні приклади демонструють призначення буфера DTA:
Приклад 1. Команда без операндів. Припустимо, що ви визвали програму CALCIT.EXE для виконання за допомогою команди CALCIT [return]. Після того, як DOS побудує PSP для цієї програми, він установить у буфері за адресою тичина.80 значення тичина.000D. Перший байт містить число символів, уведених із клавіатури після імені CALCIT, крім символу "повернення каретки". Оскільки крім клавіші Return не було натиснуто ні однієї, то число символів дорівнює нулю. Другий байт містить символ повернення каретки, тичина.0D. Таким чином, по адресах тичина.80 і 81 на ходятся 000D.
Приклад 2. Команда з текстовим операндом. Припустимо, що після команди був зазначений текст (але не імя файлу), наприклад, COLOR BY, що позначає виклик програми COLOR і передачу цій програмі параметра "BY" для установки блакитного кольору на жовтому фоні. У цьому випадку, починаючи з адреси тичина.80, DOS установить наступні значення байтів:
80:03 20 42 59 0D
Ці байти позначають довжину 3, пробіл, "BY" і повернення каретки.
Приклад 3. Команда з імям файлу в операнде. Програми типу DEL (видалення файлу) припускають після імені програми введення імені файлу як параметр. Якщо буде введено, наприклад, DEL B:CALCIT.OBJ [return], то PSP, починаючи з адрес тичина.5C і тичина.80, буде містити:
5C: 02 43 41 4C 43 49 54 20 20 4F 42 4A
C A L C I T O B J
80: 0D 20 42 3A 43 41 4C 43 49 54 2E 4F 42 4A 0D B : C A L C I T . 0 B J
Починаючи з адреси 5C, знаходиться невідкритий блок FCB, що містить імя файлу, що був зазначений у параметрі, CALCIT.OBJ, але не імя виконуваної програми. Перший символ вказує номер дисковода (02=B у даному випадку). Слідом за CALCIT знаходяться два пробіли, що доповнюють імя файлу до восьми символів, і тип файлу, OBJ. Якщо ввести два параметри, наприклад:
progname A:FILEA,B:FILEB
тоді DOS побудує FCB для FILEA по зсуві тичина 5C і FCB для FILEB по зсуві тичина.6C. Починаючи з адреси 80 у цьому випадку міститься число введених символів (довжина параметрів) - 16, пробіл (тичина.20) A:FILEA,B:FILEB і символ повернення каретки (OD).
Оскільки PSP безпосередньо передує вашій програмі, то можливий доступ до області PSP для обробки зазначених чи файлів або для виконання визначених дій. Для локалізації буфера DTA COM-програма може просто помістити тичину.80 у регістр SI і одержати доступ у такий спосіб:
MOV SI,80H;Адреса DTA
CMP BYTE PTR [SI],0;У буфері нуль?
JE EXIT
Для EXE-програми не можна з упевненістю затверджувати, що кодовий сегмент безпосередньо розташовується після PSP. Однак, тут при ініціалізації регістри DS і ES містять адреса PSP, так що можна зберегти вміст регістра ES після завантаження регістра DS:
MOV AX,DSEG
MOV DS,AX
MOV SAVEPSP,ES
Пізніше можна використовувати збережена адреса для доступу до буфера PSP:
MOV SI,SAVEPSP
CMP BYTE PTR [SI+ 80H],0;У буфері нуль?
JE EXIT
DOS версії 3.0 і страше містить команду INT 62H, завантажую щую в регістр BX адреса поточного PSP, якому можна использо вать для доступу до даних у PSP.
3. Доступ до системних змінних з програми
Спеціалізованої функції для доступу до змінних середовища не існує. Однак, аналізуючи слово в PSP під адресою 2c (вказівник на сегмент з копією стану середовища), можна вийти на масив системних змінних, і таким чином дістати потрібну змінну.
Кожна з системних змінних зберігається у вигляді стрічки, що закінчується нулем, саме так, як їх було визначено в config.sys чи autoexec.bat. Використовуючи мнемоніку асемблера, можемо написати так:
db PATH=C:\Windows,0
db PROMPT=$p$g,0
Використовуючи вже відомі команди для роботи з ланцюжками, можна легко виділити імена та значення системних змінних, і використати їх у роботі.
Лекція 12
Системні змінні BIOS та робота з ними за допомогою п?/p>