Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsia_8-11_Massivy-struktury.doc
Скачиваний:
11
Добавлен:
21.12.2018
Размер:
1.47 Mб
Скачать

1) Для выделения элемента записи необходимо:

  • Поместить запись во временную память — регистр (8-, 16- или 32-битный, в зависимости от размера записи).

  • Получить битовую маску, соответствующую элементу записи, с помощью оператора mask.

  • Локализовать биты в регистре с помощью маски и команды and.

  • Сдвинуть биты элемента к младшим разрядам регистра командой shr. Число разрядов для сдвига получить с использованием имени элемента записи.

В результате этих действий элемент записи будет локализован в начале рабочего регистра и далее с ним можно производить любые действия.

2) Чтобы поместить измененный элемент на его место в запись необходимо:

  • Используя имя элемента записи в качестве счетчика сдвигов, сдвинуть влево биты элемента записи.

  • Подготовить исходную запись к вставке измененного элемента путем обнуления битов в записи на месте этого элемента. Это можно сделать путем наложения командой and инвертированной маски элемента записи на исходную запись.

  • С помощью команды or наложить значение в регистре на исходную запись.

В качестве примера рассмотрим листинг, который переопределит поле i2 в записи iotest как 10.

 

Листинг 10.5. Работа с полем записи

.386

.model flat, stdcall

includelib import32.lib

extrn ExitProcess:PROC

extrn MessageBoxA:PROC

iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00 ; 01101100

.data

flag iotest<>

.code

main:

mov al,mask i2 ; al=01100000

shr al,i2 ; биты i2 в начале ax al=00000011

and al,0feh ;переопределили i2 00000011 and 11111110;

; al=00000010

;помещаем i2 на место

shl al,i2 ; al=0100 0000

mov bl,[flag] ; bl=01101100

xor bl,mask i2 ; сбросили i2 01101100 xor 01100000=00001100=bl

or bl,al ; наложили 0000 1100 or 0100 0000=0100 1100

; переопределили i2

mov [flag],bl ; записали новое значение записи в память

exit:

push 0h

call ExitProcess

end main ; конец программы 

_____________________________________________________

Самостоятельно на практике: Создать следующую запись

Iotest2 record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00, i6:3=110,i7:3,i8:2=01.

Разработать программу, которая полю i6 присваивает значение 101. Новое значение записи сохранить в памяти.

Дополнительные возможности обработки

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

Для установки значения некоторого поля записи используется команда setfield с синтаксисом:

setfield имя_ элемента_записи, назначение, регистр_источник

Для выборки значения некоторого поля записи используется команда getfield с синтаксисом:

getfield имя_элемента_записи, регистр_назначения, источник

Объединения

Ассемблер даёт возможность переопределить область памяти для объекта с другими типом и именем с помощью специального типа данных, называемого объединением. Объединение — тип данных, позволяющий трактовать одну и ту же область памяти как имеющую разные типы и имена.

При описании объединений в программе сначала описывается шаблон, в котором с помощью директив описания данных перечисляются имена и типы полей:

имя_объединения UNION

<описание полей>

имя_обьединения ENDS

Отличие объединений от структур состоит в том, что при определении переменной типа объединения память выделяется в соответствии с размером максимального элемента. Обращение к элементам объединения происходит по их именам, но при этом все поля в объединении накладываются друг на друга. Одновременная работа с элементами объединения исключена. В качестве элементов объединения можно использовать и структуры.

Работа с файлами.

Метод работы с файлами в системе MS DOS называется методом описателя или дескриптора. Идея работы с файлами методом описателя в MS DOS заключается в следующем:

1. Вначале файл должен быть открыт, при этом должно быть указано имя файла - либо полное (полный путь), либо краткое. В последнем случае файл берется из текущего каталога. В конце имени файла должен стоять код 0.

2. После того как файл был удачно открыт, ему присваивается описатель - число от 5 до 256 (записывается в регистр АХ). Дальнейшая работа с файлом будет вестись через этот описатель. Под таблицу описателей отводится 20 байт, поэтому программа не может открыть одновременно более 20 файлов.

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