Команды сдвигов Команды сдвигов и циклических сдвигов перемещают все биты операнда влево или вправо на указанное число, определяемое вторым операндом. Формат: Мнемоника ор1, CNT , где CNT - либо 1, либо CL, либо 8- битная константа. Команды сдвигов воздействуют на все флажки ( кроме AF ), а команды циклического сдвига влияют только на CF и OF. Во всех командах флажок OF содержит полезную информацию: если сдвиг производится на один разряд, то он устанавливается по правилу: если два старших бита операнда равны, OF = 0, в противном случае OF = 1, т.е. изменяется знаковый разряд операнда. Во всех командах CF содержит последний выдвинутый разряд. Мнемоника Описание SHL Сдвиг влево логический, последний выдвинутый разряд сохраняется в CF SAL Сдвиг влево арифметический ( аналогично SHL ) SHR Сдвиг вправо логический SAR Сдвиг вправо арифметический, знаковый разряд не меняется ROL Сдвиг циклический влево RCL Сдвиг циклический влево через перенос ( CF ) RОR Сдвиг циклический вправо RCR Сдвиг циклический вправо через CF Пример: Подсчитать количество единиц в слове АМР. …………… MOV AX, AMP XOR BX, BX MOV CX, 16 M1: SHL AX, 1 ; СДВИГ JNC M2 INC BX M2: LOOP M1 CLC Команды сдвига двойного слова SHLD op1, reg2, CNT ; op1 – регистр или память 16/32 бита Сдвиг двойного слова влево. Содержимое ор1 и регистра объединяются в рабочем регистре двойной длины и сдвигаются влево на CNT бит. После сдвига в ор1 помещаются соответствующие биты рабочего регистра. Содержимое reg2 не изменяется. SHRD op1, reg2, CNT ; op1 – регистр или память 16/32 бита Сдвиг двойного слова вправо. Содержимое регистра и ор1 объединяются в рабочем регистре двойной длины, причем ор1 в младших байтах, а reg2 – в старших. После сдвига в ор1 помещаются соответствующие биты рабочего регистра. Содержимое reg2 не изменяется. Пример: Пусть в ах хранится 0123H, bx – FFFFh SHLD AX, BX, 4 ; AX = 123Fh, BX = FFFFh SHRD AX, BX, 4 ; AX = F012h, BX = FFFFh Вывод на экран (текстовый режим). Функции 21h прерывания DOS . 02h AH ; Вывод на экран в текущую позицию курсора символа, код которого в ASCII находится в регистре DL. Возвращает в AL код последнего выведенного символа. Функция обрабатывает при выводе и управляющие символы: BEL ( 07h ) - звуковой сигнал; BS ( 08h ) - возврат влево на 1 позицию курсора; LF ( 0Ah ) - перевод курсора на следующую строку ( вниз на позицию ); CR ( 0Dh ) - перевод курсора на начало текущей строки. При нажатии при работе этой функции клавиш Ctrl + Break вызывает прерывание 23h, осуществляющее выход из программы. Пример: MOV DL, ‘$’ MOV AH , 02h INT 21h ; Вывод в текущую позицию курсора символа $ 09h AH ; Вывод строки на экран. DS:DX указатель к началу символьной строки, которая должна заканчиваться ‘$’. Пример: str db ‘Exempl string’, 10,13.’$’ mov dx, offset str mov ah, 09h int 21h Функции ввода с клавиатуры прерывания 21Н 01H AH ; Ввод с клавиатуры с эхом. Функция ожидает ввод с клавиатуры. Если получен символ ASCII, он записывается в AL. Если AL содержит 00H, то получен расширенный ASCII код, второй байт которого будет прочитан при следующем выполнении функции (Home, Ins, Alt +(A-Z) и т. п). При выполнении функции проверяется наличие Ctrl + Break. 06H AH ; Прямой ввод-вывод на консоль.(Общее для клавиатуры и экрана имя). DL FFh для ввода с клавиатуры; DL 00h – FEh для вывода на экран символа ASCII из DL. Если DL =FFh выполняется ввод и AL готов принять символ. Если ZF=1 , нет входного символа и значение AL несущественно. Если ZF = 0 , имеется символ и он записывается в AL. Функция не ожидает появления символа, читает без эхо и не проверяет Ctrl + Break. 07h AH ; Прямой ввод с клавиатуры без эхо. Аналогична 01h, но читает без эхо и не проверяет Ctrl + Break. 08h AH ; Ввод с клавиатуры без эхо. Аналогична 01h, но читает без эхо. Символ в AL.