КАТЕГОРИИ: Архитектура-(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. МАКРОСРЕДСТВА АССЕМБЛЕРА ПЛАН РАЗДЕЛА
ТРАНСЛЯЦИЯ С МАКРОРАСШИРЕНИЯМИ
ПСЕВДООПЕРАТОРЫ ЭКВИВАЛЕНТНОСТИ EQU И = Присваивают символическому имени значение выражения.
К простейшим макросредствам языка ассемблера можно отнести псевдооператоры equ и " = " (равно). Синтаксис псевдооператора equ:
Синтаксис псевдооператора “ = ”:
Несмотря на внешнее и функциональное сходство псевдооператоры equ и “ = ” отличаются следующим:
К примеру:
Псевдооператор “ = ” удобно использовать для определения простых абсолютных (то есть не зависящих от места загрузки программы в память) математических выражений.
Набор этих директив следующий:
Эти директивы очень удобно использовать при разработке макрокоманд, которые являются следующим макросредством, предоставляемым компилятором ассемблера.
Дата добавления: 2014-01-07; Просмотров: 385; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |