КАТЕГОРИИ: Архитектура-(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) |
ЛЕКЦИЯ 8. Различают следующие команды работы с битами
ОСНОВНЫЕ КОМАНДЫ РАБОТЫ С БИТАМИ Различают следующие команды работы с битами 1. Логические операции 2. Сдвиги Эти команды выполняются над битами байта или слова. По-этому они называются побитовые. ЛОГИЧЕСКИЕ КОМАНДЫ В ассемблере принято следующее правило - если содержимое бита=0 это означает false. ТАБЛИЦА: Основные операции булевой алгебры В ассемблере побитовые команды применяются к каждому биту байта или слова отдельно. ТАБЛИЦА: Логика работы побитовых команд
Маскирование разрядов <источник> в логических командах с 2мя операндами называется маска. Значения маски обычно задаются обычно в 2 или 16 коде. Оно означает, что в соответствующем разряде установлена 1. ТАБЛ: Значение маски
ЛАБА 3 Создание.com файла В ОС Windows основными характеристиками исполняемого файла типа.com является: 1. Длина файла ограничивается длиной 1 сегмента и не может превышать 64 кб 2. Отсутвуют сегмент стека и сегмент данных. Все данные программы находятся в сегменте кода 3. Все процедуры должны иметь атрибут NEAR т.е. модель памяти TINY 4. В программе необходимо установить значение начального смещения равного 100h -> 256 байт это выполняется директивой ORG 100h 5. Нет необходимости специально готовить стек, это делает ОС
6. Все данные и зарезервированную память необходимо размещать в виде блока в начале программы кода или после него, лучше перед; используется команда jmp для перехода к командам 7. Этапы компиляции a. Создание.obj и листинга b. Создание исполнительного файла.com tlink -t laba.obj -> laba2.com
;laba2.asm .model TINY .code ORG 100h Start jmp SHORT main ;==============DATA================ var1 dw 3 var2 dw 4 ;==============CODE================ main proc near mov ax,var1 mov bx,var2 add ax,bx ret main endp end Start При помощи системного отладчика DEBUG загружаем файл в ОЗУ (DEBUG laba2.com). Выполняем команду d 100 (Выводит дамп памяти который начинается с <CS>:0100h). При помощи листинга найти в дампе памяти коды созданной вами программы. Командой отладчика r вывести содержимое регистра. Затем использовать команду t - трассировка и проследить за регистрами ax и bx. q - quit. Создать ехе. Использование команд логического умножения AND и TEST Результат поразрядного логического умножения дает значение истина только в одном случае: если соответствующие разряды приемника и маски тоже установлены в 1. По этому операция эта операция используется для проверки установленных разрядов в 1. Команда TEST используется для логического сравнения операндов с последующим условием перехода. Пример: Пусть в результате каких-то вычислений сформировалась целочисленная переменная х, требуется проверить содержимое 1, 2, 10, 15 битов. Проверить биты можно все сразу или по разряду. Проверку всех сразу выполним в программе на СРР побитовую проверку на ассемблере. Бит1 0002 Бит2 0004 Бит10 0400 Бит15 8000 Результат 8406 #include <iostream.h> int k, x=0xFA01; void main() { cout<<"\n==Incoming value==\n"<<"x="<<hex<<x<<"(hex);"<<dec<<x<<"(dec)\n"; k=x&8406; cout<<"\n Logic Multiplication Result \n"<<"k="<<hex<<k<<"(hex);"<<dec<<k<<"(dec)\n"; } OUT: x=FFFFFA01(hex); -1535(dec); Logic Multiplication Result FFFF8000(hex); -32768(dec); FA01->1111 1010 0000 0001
8406->1000 0100 0000 0110 1000 0000 0000 0000 -> 8000 hex Пусть начальное значение х=FFFF CFC7 (hex) -> -12345(dec) Результат FFFF8406(hex); -31738(hex) Число -12345 в двоичном виде имеет единицы в битах 1,2,10,15 Код на ассеблере Public ex AND ex AND proc far ;test bit 1 mov ax,x AND ax,Ox0002 mov k,ax ;test bit 2 mov ax,x AND ax,Ox0004 mov k,ax ;test bit 10
ret ex AND endp Использование команд логического сложения OR Результат поразрядного логического сложения дает 0 только в случае если соответствующие разряды приемника или маски = 0 Использование команды логического сложения по модулю XOR Эта команда дает значение 0 если соответствующие приемника и маски ОДИНАКОВЫЕ. Истина (1) получается если соответствующие разряды приемника и маски разные. Команда логического отрицания NOT Используется для инверсии. k=~x; поразрядное НЕ k=!x; НЕ КОМАНДЫ СДВИГА Это другая разновидность побитовых команд. Они перемещают биты в поле операнда "приемник" либо влево либо вправо. Имя_команды приемник, источник Сдвиг: 1. Линейный a. Арифметический b. Логический 2. Цикличный Допустимые сочетания операндов для команд сдвигов
................. Линейные команды сдвига добавляют ноль в младший разряд при сдвиге влево либо в старший разряд при сдвиге вправо. При сдвиге вправо старший разряд различается для знаковых или без знаковых чисел. Удаляемые из операнда разряды последовательно перемещаются в регистр флагов CF Эти команды позволяют очень быстро выполнять деление операндов сдвиг вправо и умножение - сдвиг влево на степени числа 2
SAL - Shift Arithmetical operand Left SAR - Shift Arithmetical operand Right Применяются для знаковых целочисленых данных Логика работы команды SAL
Логика работы команды SAR Таблица Пример mov al,58 sal al,1;сдвиг влево на 1 разряд sal al,3 Таблица Выводы:
· Изначально в регистре al хранилось число 58 · Сдвиг al=116 · Следующий сдвиг НЕКОРЕКТЕН АХАХАХА т.к. результат не помещается в байт · При использовании сдвига следует четко представлять диапазон допустимых значений в поле операнда · На знаковый бит у команды sal нет никакой реакции КОМАНДЫ ЛОГИЧЕСКОГО СДВИГА SHL,SHR Предназначен для работы с без знаковыми целыми числами. Абсолютно одинаковы с командами SAL и SAR КОМАНДЫ ЦИКЛИЧЕСКОГО СДВИГА В отличии от арифметического и логического сдвига эти команды сохраняют значение сдвигаемых бит. Команды делятся на 2 группы: · Команды простого циклического сдвига o ROL o ROR · Команды циклического сдвига через флаг переноса CF o RCL o RCR
Логика работы команды ROL Таблица Логика работы команды RCR Таблица Команды передачи управления Команды безусловной передачи управления Адрес следующей выполняемой команды находится в регистре IP (Instruction Pointer) команды передачи управления позволяют нарушить естественную последовательность команд посредством изменения содержимого регистра IP. В ассемблере есть 3 группы базовых команд передачи управления · Команды безусловного перехода на определенный адрес в памяти · Команды перехода в зависимости от проверки результатов условия · Команды организации циклических вычислений Команды передачи управления не изменяют значения флагов КОМАНДЫ БЕЗУСЛОВНОГО ПЕРЕХОДА · JMP. Аналог высокоуровнего goto метка. JMP метка. Метка помечает команду на которую нужно передать управление. Метка может иметь 2 атрибута o NEAR(deafult). <IP>=<IP>+смещение к команде. Смещение не более 2х байт. Команда на которую указывает метка может распологаться в сторону больших адресов. JMP FORWARD/JMP BACK. Можно с экономить 1 байт если задать короткий переход (1 байтовое смещение) JMP SHORT метка. o FAR. Безусловный переход осуществляется в другой сегмент. В этом меняется не только содержимое регистра IP, но и изменяется содержимое регистра CS. <CS>=<CS>+Code · CALL. o Идейно команда call аналогична команде JMP, но команда call вызывает процедуру и возвращает к точке прыжка. Адрес начальной точки сохраняется в стеке. CALL имя_процедуры. Если у процедуры есть параметны то они передаются в стек до вызова процедуры. Разные языки по разному работают с параметрами процедуры. Для учета этого команду CALL следует использовать в расширеном синтаксисе.
CALL имя_процедуры, язык, параметр1...параметр N
§ NEAR. PUSH IP <IP>=<IP>+смещение § FAR. PUSH IP PUSH CS <IP>=<IP>+смещение <CS>=<CS>+Code · RET. Команда возврата в точку вызова из процедуры. Эта команда команда обратная команде CALL она обеспечивает возврат управления вызывающей команде и если нужно очистку стека на величину 16-ти разрядной константы. RET [Im16]
Дата добавления: 2014-12-16; Просмотров: 427; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |