Шаг 13 - Организация цикла




Циклы организуются на основе команд условного перехода. Одна из таких команд jcxz. Переход будет выполнен по ней только в том случае, если в регистре CX находится ноль. Создаем программу:

MODEL TINYSTACK 256 DATASEG Hellostr DB 'Hello First Step Site 'CODESEG start: mov ax,@data mov ds,ax mov cx,4w1: dec cx push cx mov bx,1 mov cx,21 mov dx,offset Hellostr mov ah,40h int 21h pop cx jcxz endprog jmp w1 endprog: mov ah,04Ch mov al,1h int 21hend start

Так как для перехода используется регистр CX и этот же регистр используется для вывода символов в функции 40h, то нам его придется помещать в стек и извлекать из стека. Смотрим:

mov cx,4w1: dec cx push cx

Задаем начальное значение на единицу больше, потом метка, а потом сразу его уменьшаем и сохраняем в стек. После вывода строки восстанавливаем из стека о команда jcxz проверяет на ноль, если не ноль, то назад к метке w1 и на единицу меньше.

pop cxjcxz endprog

Запускаем:

 

Шаг 14 - Размер стека

Так как стек это некоторая память (подробнее читай "Шаг 12 - Что такое стек"), то она имеет размер. И этот размер определяется директивой STACK. Если программе понадобится больше стека чем Вы выделили, как в данном примере:

MODEL TINYSTACK 1h DATASEG Hellostr DB 'Hello First Step Site 'CODESEG start: mov cx,10hw1: push cx dec cx jcxz endprog jmp w1 endprog: mov ah,04Ch mov al,1h int 21hend start

Все закончится плачевно:

Достаточно этот размер увеличить:

MODEL TINYSTACK 100h DATASEG

Все будет нормально.

 

Шаг 15 - Что такое IOCTL

Действительно функции MS DOS и BIOS обеспечивают нас многими возможностями. Но не всеми. А только самыми необходимыми, стандартными. Но устройств много и много специфических возможностей. Сама аббревиатура IOCTL это I/O Control. Реализуется этот контроль ввода вывода прерыванием Int 21H функцией 44H. Естественно что шаги по TASM я пишу не просто так. Если Вы читаете раздел VC++ то последние шаги на данный момент там были "Шаг 165 - Получения дескриптора VXD", "Шаг 166 - Функция DeviceIoControl". Наверно часть народа догадалась после этого шага к чему я клоню. Итак, эта функция 44h обеспечивает прямую связь между прикладной программой и драйвером устройства. Позволяет программе получать аппаратно-зависимую информацию и запрашивать операции, которые не поддерживаются другими функциональными вызовами MS-DOS. Вот оно. Эта функция позволяет работать напрямую с драйвером оборудования. А драйвера оборудования пишутся тоже по правилам. И если драйвер написан по правилам, то мы может к нему обратиться используя эту функцию. Вот так. Итак, как мы управляем устройствами можем несколькими методами, смотрим схему.

Мы можем использовать функции DOS, они умеют делать операции высокого уровня например создать файл. Мы можем использовать BIOS это более мелкие операции как например абсолютное чтение сектора с диска. DOS скорее всего то же пользуется функциями BIOS. И наконец мы можем использоваться функций DOS 44h для обращения к драйверу устройства. В каком он виде программном или аппаратном в данном случае нас не волнует.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: