Записи: дополнительные возможности обработки
Понимая важность для эффективного программирования такого типа данных, как запись, разработчики транслятора TASM, начиная с версии 3.0, включили в систему его команд две дополнительные команды на правах директив.
Последнее означает, что эти команды внешне имеют формат обычных команд ассемблера, но после трансляции они приводятся к одной или нескольким машинным командам.
Введение этих команд в язык TASM повышает наглядность работы с записями, оптимизирует код и уменьшает размер программы.
Эти команды позволяют скрыть от программиста действия по выделению и установке отдельных полей записи (мы их обсуждали выше).
Для установки значения некоторого поля записи используется команда setfield с синтаксисом:
setfield имя_элемента_записи назначение,регистр_источник |
Для выборки значения некоторого поля записи используется команда getfield с синтаксисом:
getfield имя_элемента_записи регистр_назначение, источник |
Работа команды setfield заключается в следующем. Местоположение записи определяется операндом назначение, который может представлять собой имя регистра или адрес памяти.
Операнд имя_элемента_записи определяет элемент записи, с которым ведется работа (по сути, если вы были внимательны, он определяет смещение элемента в записи относительно младшего разряда). Новое значение, в которое необходимо установить указанный элемент записи, должно содержаться в операнде регистр_источник. Обрабатывая данную команду, транслятор генерирует последовательность команд, которые выполняют следующие действия:
|
|
- сдвиг содержимого регистр_источник влево на количество разрядов, соответствующее расположению элемента в записи;
- логическую операцию or над операндами назначение и регистр_источник. Результат операции помещается в операнд назначение.
Важно отметить, что setfield не производит предварительной очистки элемента, в результате после логического сложения командой or возможно наложение старого содержимого элемента и нового устанавливаемого значения. Поэтому требуется предварительно подготовить поле в записи путем его обнуления.
Действие команды getfield обратно setfield. В качестве операнда источник может быть указан либо регистр либо адрес памяти.
В регистр, указанный операндом регистр_назначение, помещается результат работы команды — значение элемента записи.
Интересная особенность связана с регистр_назначение. Команда getfield всегда использует 16-битный регистр, даже если вы укажете в этой команде имя 8-битного регистра.
В качестве примера применения команд setfield и getfield рассмотрим листинг 9.
Листинг 9. Работа с полями записи;prg_12_8.asmmasmmodel smallstack 256iotest recordi1:1,i2:2=11,i3:1,i4:2=11,i5:2=00.dataflag iotest <>.codemain: mov ax,@data mov ds,ax mov al,flag mov bl,3 setfield i5 al,bl xor bl,bl getfield i5 bl,al mov bl,1 setfield i4 al,bl setfield i5 al,blexit: mov ax,4c00h ;стандартный выход int 21hend main ;конец программы |
Результат работы команд setfield и getfield удобнее всего изучать в отладчике.
|
|
При установке значений полей не производится их предварительная очистка. Это сделано специально. Для такого рода операций лучше использовать некоторые универсальные механизмы, иначе велик риск внесения ошибок, которые трудно обнаружить и исправить. В качестве такого механизма можно предложить механизм макросредств.
В заключение хотелось бы привести еще один пример использования записей.
Это описание регистра eflags. Для удобства мы разбили это описание на три части:
- eflags_1_7 — младший байт eflags/flags;
- eflags_8_15 — второй байт eflags/flags;
- eflags_h — старшая половина eflags.
eflags_l_7 record sf7:1=0,zf6:1=0,c5:1=0,af4:1=0,c3:1=0,pf2:1=0,c1:=1,cf0:1=0eflags_l_15 record c15:1=0,nt14:1=0,iopl:2=0,of11:1=0,df10:1=0,if9:1=1,tf8:1=0eflags_h record c:13=0,ac18:1=0,vm17:1=0,rf16:1=0 |
Запомните это описание. Когда вы освоите работу с макрокомандами и в дальнейшей своей работе столкнетесь с необходимостью работать с регистром флагов, то у вас буквально “зачешутся” руки, чтобы написать соответствующую макрокоманду. Эта макрокоманда, если вы не забудете хорошо ее оттестировать, избавит вас от многих трудно обнаруживаемых ошибок.
|
|
Дата добавления: 2019-09-13; просмотров: 171; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!