|
|
|
|
Применение директивы 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
|
что эквивалентно
В качестве примера, если мы хотим просмотреть весь список чисел в поисках первого числа с плавающей запятой меньше 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:...
|
|
|