На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 1 / Применение директивы STRUC Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Применение директивы STRUC

Структуры представляют собой директивы ассемблера, позволяющие нам строить сложные форматы данных, состоящие из байтов, слов и т.д., таким образом, чтобы они имели большую смысловую выразительность и доступность. Они очень похожи на структуры Си и записи Паскаля. А отличаются они тем, что в МASM индексирование затруднено, вложенность вообще запрещена. В качестве примера, который мы можем использовать в макросе, передающем параметры, разрешите предположить, что Вы написали программу, выполняющую математические функции. Ниже приводится структура, которую Вы могли бы создать:



            MathNumbers      STRUC
            BooLean1         DB         (0)     ; 1 байт
            BooLean2         DB         (0)     ; 1 байт
            ShortInteger1    DW         (0)     ; 1 слово
            ShortInteger2    DW         (0)     ; 1 слово
            LongInteger1     DD         (0)     ; 1 двойное слово
            LongInteger2     DD         (0)     ; 1 двойное слово
            Float1           DT         (0)     ; 1 10-байтовое слово
                                                ; (для 8087)
            Float2           DT         (0)     ; 1 10-байтовое слово
                                                ; (для 8087)
            MathNumbers      ENDS

MathNumbers определяет тип структуры. STRUС и ENDS ограничивают начало и конец описания структуры. Теперь мы можем использовать MаthNumbers для объявления некоторых данных, например, так:



            TrueFalse   MathNumbers    <1,0,,,,,,>
            MaxMinShort MathNumbers    <,,32767,-32768,,,,>
            MaxMinLong  MathNumbers    <,,,,2147483647,-2147483648,,>
            e           MathNumbers    <,,,,,,,2.718281828>

            ListLength  = 100
            MathList    MathNumbers    ListLength dup <,,,,,,,>

Память зарезервирована под 104 числа. При 34 байтах под число наш список чисел займет 3536 байтов. Первоначально структура в своем описании инициализируется в 0, а затем в секции данных устанавливается в различные значения. Структуры могут рассматриваться как директивы данных, определяемые пользователем. Имена элементов структуры преобразуются MASM в побайтовое смещение относительно начала структуры. Теперь ссылаться на числа структуры Вы можете по имени поля точно так, как это делается в Си или Паскале. Например,



            сmр       MaxMinShort.ShortInteger1,ax

что эквивалентно


            cmp       [MaxMinShort + 2],ax

В качестве примера, если мы хотим просмотреть весь список чисел в поисках первого числа с плавающей запятой меньше 0, следует написать:



                      mov      di,MathList ;получить адрес списка
                      mov      cx,ListLength ;длина списка для зацикл-я
                      mov      bx,(TYPE TrueFalse) ;длина структуры
            CmpLup:   cmp      [di].Float1,0 ;число с ПЗ > 0?
                      jl       ExitLup  ;если нет, искать
                      add      di,bx    ;указатель на др.структуру
                      loop     Cmplup   ;просмотреть весь список эл-ов
            ExitLup:...

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz