Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Макродирективы для работы с текстом

...

MOV flag, BL

SETfield i2 bx, ax

Mov ah,0

MOV BL, flag

Code

Data

SETfield поле_записи регПриемник, регИсточник

УСТАНОВИТЬ ЗНАЧЕНИЕ ПОЛЯ (SETFIELD)

Getfield поле_записи регПриемник, регИсточник

...

Getfield i2 bx, ax

Mov al, flag

Mov ah,0

...

Code

Data

ПОЛУЧИТЬ ЗНАЧЕНИЕ ПОЛЯ (GETFIELD)

Mov ds,ax

CODE

DATA

STACK 256

MODEL SMALL

УСТАНОВКА ПОЛЯ ЗАПИСИ

Jmp exit

Jne I2_is_not_10

Mov ds,ax

CODE

DATA

STACK 256

MODEL SMALL

ПРОВЕРКА ПОЛЯ ЗАПИСИ

АССЕМБЛЕРНАЯ ПОМОЩЬ В РАБОТЕ С ЗАПИСЯМИ

1. Можно вычислить битовую ширину как поля записи, так и всей записи

MOV AL, WIDTH i2; операнд – имя ПОЛЯ ЗАПИСИ

...

MOV AX, WIDTH iotest; операнд – имя ТИПА записи
; (ПЕРЕМЕННОЙ типа Записи)

 

2. Можно копировать запись, маскируя все биты, КРОМЕ ТРЕБУЕМОГО ПОЛЯ:

MOV AL, MASK i2; в AL окажется 0 0 0 0 0 1 1 0

 

3. Транслятор tasm.exe (ЦП>= 80386) связывает ИМЕНА полей с их сдвигом
относительно младшего разряда.

Flag2 iotest <>; Flag2 = 1 1 111 10 0

То есть КАК БЫ «i1=7», «i2=5», «i3=4», «i4=2», «i5=0».
То есть «На сколько бит надо запись сдвинуть вправо, стобы поле встало в младшие разряды записи»

 

iotest record i1:1=0,i2:2=10,i3:1=0,i4:2=11,i5:2=00; шаблон записи

; 0 10 0 11 00 = 4Ch

flag iotest <>

main:

mov ax,@data

mov bl, flag;bl содержит копию flag = 0100 1100

mov al,mask i2; al содержит МАСКУ поля i2 = 0110 0000

and bl, al; в bl сброшены все биты, кроме поля i2 (bl=0100 0000)

shr bl,i2;биты поля i2 перегнали в младшие разряды bl (bl=0000 0010)

CMP BL, 10B; АНАЛИЗИРУЕМ ПОЛЕ i2

; обработка ситуации i2=10b

;....

i2_is_not_10:

; обработка ситуации i2 <> 10b

;....

exit:

mov ax,4c00h;стандартный выход

int 21h

end main; закончить трансляцию, точка входа - main.

 

Предположим, мы хотим программно установить i2 = 01b.

 

iotest record i1:1=0,i2:2=10,i3:1=0,i4:2=11,i5:2=00; шаблон записи

; 0 10 0 11 00 = 4Ch

flag iotest <>

main:

mov ax,@data

mov BL, flag; bl содержит копию flag. BL = 0100 1100 mov AL,mask i2; al содержит МАСКУ поля i2 AL= 1001 1111

AND BL, AL; в bl сброшены только биты поля i2. BL= 0000 1100

; чтобы потом писать поверх нулей, а не поверх старого значения i2

mov AL, 0000 00001; в мл. разрядах AL – желаемое новое значение AL= 0000 0001

SHL AL, i2; перегнали новое i2 в правильную позицию. AL= 0010 0000

OR BL, AL; установка нового i2. Остальное без изменения. BL= 0010 1100

mov flag, BL; запись измененной записи

exit:

mov ax,4c00h;стандартный выход

int 21h

end main; закончить трансляцию, точка входа – main.

 

Как видим, мороки довольно много. Причина – сдвиги полей заданы в БИТАХ. Но, к счастью, о нас позаботились…

 

iotest record i1:1=0, i2:2=10, i3:1=0, i4:2=11, i5:2=00

flag iotest <>

ОГРАНИЧЕНИЕ: регистры только 16-битные!

 

ОГРАНИЧЕНИЕ: регистры только 16-битные!

 

iotest record i1:1=0, i2:2=10, i3:1=0, i4:2=11, i5:2=00

flag iotest <>

mov al, 01B; требуемое i2

 

ИТОГИ

1. Ассемблер поддерживает сложные типы данных, что немного приближает его к языкам высокого уровня.

 

Так ли необходимо было вводить в ассемлер эти средства – вопрос дискуссионный.

 

2. Структуры (struc) позволяют программно моделировать записи баз данных и манипулировать с ними.

3. Объединения (union)позволяют накладывать разнотипные данные в памяти, что открывает дополнительные возможности анализа данных.

4. Записи (record) расширяют возможности выборочной побитовой обработки данных.

5. ОБЩЕЕ ЗАМЕЧАНИЕ. Работа со сложными структурами данных требует повышенного внимания и аккуратности!

 


Раздел 14. МАКРОСРЕДСТВА АССЕМБЛЕРА

ПЛАН РАЗДЕЛА

  1. Механизм макрорасширения.
  2. Псевдооператоры эквивалентности.
  3. Текстовые макросы.
  4. Макрокоманды.
  5. Директивы повторения.
  6. Директивы условной компиляции.
  7. Управление компиляцией.

 

ТРАНСЛЯЦИЯ С МАКРОРАСШИРЕНИЯМИ

 

ПСЕВДООПЕРАТОРЫ ЭКВИВАЛЕНТНОСТИ EQU И =

Присваивают символическому имени значение выражения.

 

К простейшим макросредствам языка ассемблера можно отнести псевдооператоры equ и " = " (равно).
В качестве выражения могут быть использованы константы, имена меток, символические имена и строки в апострофах. После присвоения этим конструкциям символического имени его можно использовать везде, где требуется размещение данной конструкции.

Синтаксис псевдооператора equ:

имя_идентификатора equ строка или числовое_выражение

Синтаксис псевдооператора “ = ”:

имя_идентификатора = числовое_выражение

Несмотря на внешнее и функциональное сходство псевдооператоры equ и “ = ” отличаются следующим:

  • из синтаксического описания видно, что с помощью equ идентификатору можно ставить в соответствие как числовые выражения, так и текстовые строки, а псевдооператор “ = ” может использоваться только с числовыми выражениями;
  • идентификаторы, определенные с помощью “ = ”, можно переопределять в исходном тексте программы, а определенные с использованием equ — нельзя.

К примеру:

masm model small stack 256 mas_size equ 10;размерность массива akk equ ax;переименовать регистр mas_elem equ mas[bx][si];адресовать элемент массива .data ;описание массива из 10 байт: mas db mas_size dup (0) .code mov akk,@data;фактически mov ax,@data mov ds,akk;фактически mov ds,ax ... mov al,mas_elem;фактически — mov al,mas[bx][si]

Псевдооператор “ = ” удобно использовать для определения простых абсолютных (то есть не зависящих от места загрузки программы в память) математических выражений.
Главное условие то, чтобы транслятор мог вычислить эти выражения во время трансляции.
К примеру:

.data adr1 db 5 dup (0) adr2 dw 0 len = 43 len = len+1;можно и так, через предыдущее определение len = adr2-adr1

Набор этих директив следующий:

  • директива слияния строк catstr:
    идентификатор catstr строка_1,строка_2,... — значением этого макроса будет новая строка, состоящая из сцепленной слева направо последовательности строк строка_1,строка_2,...
    В качестве сцепляемых строк могут быть указаны имена ранее определенных макросов.
    К примеру:
pre equ Привет,name equ < Юля>privet catstr pre,name;privet= “Привет, Юля”
  • директива выделения подстроки в строке substr:
    идентификатор substr строка,номер_позиции,размер — значением данного макроса будет часть заданной строки, начинающаяся с позиции с номером номер_позиции и длиной, указанной в размер.
    Если требуется только остаток строки, начиная с некоторой позиции, то достаточно указать только номер_позиции без указания размера.
    К примеру:
;продолжение предыдущего фрагмента:privet catstr pre,name;privet= “Привет, Юля”name substr privet,7,3;name=“Юля”
  • директива определения вхождения одной строки в другую instr:
    идентификатор instr номер_нач_позиции,строка_1,строка_2 — после обработки данного макроса транслятором идентификатору будет присвоено числовое значение, соответствующее номеру (первой) позиции, с которой совпадают строка_1 и строка_2.
    Если такого совпадения нет, то идентификатор получит значение 0;
  • директива определения длины строки в текстовом макросе sizestr:
    идентификатор sizestr строка — в результате обработки данного макроса значение идентификатор устанавливается равным длине строки.
;как продолжение предыдущего фрагмента:privet catstr pre,name;privet= “Привет, Юля”len sizestr privet;len=10

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

<== предыдущая лекция | следующая лекция ==>
Работа с записями | Макрокоманды
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 369; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.018 сек.