ЛОГИЧЕСКИЕ КОМАНДЫ И КОМАНДЫ СДВИГА

ЛОГИЧЕСКИЕ КОМАНДЫ И КОМАНДЫ СДВИГА. AND DST, SRC поразрядное логическое И . mov dh, 10101100b and dh, 0f0h в результате выполнения этих двух команд содержимое DH станет равно 1010b. 2. OR DST, SRC поразрядное логическое ИЛИ . or bx, dx если BX 5F0Fh, а DX 7777h, то после операции BX 7F7Fh. BX 0101 1111 0000 1111 5F0F DX 0111 0111 0111 0111 7777 BX результат 0111 1111 0111 1111 7F7F 3. XOR DST, SRC поразрядное логическое исключающее ИЛИ . xor al,55h если AL 5ah, то после операции AL 0fh. 4. NOT DST инверсия всех битов приемника. 5. TEST DST, SRC выполняет операцию AND над операндами, но воздействует только на флаги и не изменяет самих операндов. 6. SHR DST, CNT логический сдвиг вправо, освобождающиеся слева биты заполняются нулем, крайний правый бит выталкивается во флаг CF. Операнд DST может быть ячейкой памяти. mov bl,10110010b CF x shr bl,1 BL 01011001, CF 0 до сдвига 1 0 1 1 0 0 1 0 CF X после сдвига 0 0 1 0 1 1 0 0 1 CF 0 mov cl,4 shr bl, cl BL 0101, CF 1. 7. SHL DST, CNT логический сдвиг влево. 8. RLC DST, CNT циклический сдвиг влево через перенос 9. RRC DST, CNT циклический сдвиг вправо через перенос 10. ROR DST, CNT циклический сдвиг влево 11. ROL DST, CNT циклический сдвиг вправо КОМАНДЫ ПЕРЕДАЧИ УПРАВЛЕНИЯ 1. CALL SUBR вызов подпрограммы с адресом SUBR call delay mov 2. RET возврат из подпрограммы к оператору следующему непосредственно за CALL, то есть в приведенном выше примере к MOV 3. JMP NAME безусловный переход к команде с символическим адресом NAME. jmp short name переход к метке name, отстоящей не более чем на -128 или 127 байтов. jmp near name переход к метке name, отстоящей не более чем на 65535 байтов, в одном сегменте. jmp name аналогично jmp near name 4. JA NAME или JNBE NAME условный переход, если, например, в результате сравнения CMP DST, SRC приемник по абсолютной величине больше источника, то перейти к метке name. 5. JB NAME или JNAE NAME условный переход, если, например, в результате сравнения CMP DST, SRC приемник по абсолютной величине меньше источника, то перейти к метке name команды п4 и п5 выполняются по результатам выполнения операций над беззнаковыми числами . 6. JZ NAME или JE NAME перейти, если результат операции влияющей на флаг нуля - нулевой переход по нулю . 7. JNZ NAME или JNE NAME переход по не нулю . команды п6 и п7 выполняются по результатам выполнения операций над числами cо знаком. КОМАНДЫ УПРАВЛЕНИЯ ЦИКЛАМИ 1. LOOP NAME эта команда неявно уменьшает CX на 1 и осуществляет переход к ближней метке, если CX не равно 0. mov cx,64h блок операторов от метки syc до loop syc syc будет выполнен 100 раз. loop syc 2. LOOPZ NAME или LOOPE NAME кроме того осуществляет проверку ZF флага.

Поэтому цикл заканчивается по условию, когда CX 0 или ZF 0 или и то и другое вместе.

Т.о. эта команда служит для обнаружения первого ненулевого результата. 3. LOOPNZ, LOOPNE - выход из цикла по нулю . mov cx,1000d цикл может быть завершен раньше 1000 next прохода, если содержимое аккумулятора станет равным 129,т.е. равным ASCII коду cmp al, Б буквы Б. loopnz next 9.3.9 КОМАНДЫ ОБРАБОТКИ СТРОК ЦЕПОЧЕК БАЙТОВ 1. LODSB команда lodsb загружает байт адресованный регистром SI из сегмента данных, и увеличивает SI на 1, если перед этим была введена команда CLD очистить флаг направления DF и уменьшает SI на 1, если была использована команда STD установить флаг направления . .DATA string DB abcdefg. CODE cld после выполнения этих команд в AL будет mov si,OFFSET string 2 загружен ASCII код с lodsb причем содержимое SI будет указывать на d . 2. MOVSB эта команда перемещает один байт из ячейки памяти с адресом в регистре SI в ячейку памяти с адресом в регистре DI и увеличивает SI и DI на 1. Значение SI может находиться, как в сегменте данных DS, так и в дополнительном сегменте ES. Значение DI может находиться только в дополнительном сегменте ES. .DATA msg DB Всё O.K. LEN - msg LEN равно 8 .CODE cld lea si, msg в SI адрес источника mov ax,0b800h начало сегмента видеопамяти mov es, ax поместить в дополнительный сегмент lea di, es 0a0h 3 4-я строка сверху mov cx,LEN LEN - количество выводимых символов rp movsb переслать символ в текущую позицию экрана inc di перешагнуть через позицию атрибута loop rp повторить до исчерпания CX строка Всё O.K. будет выведена в 4-ю строку дисплея сверху. 3. REP префикс повторения команды.

Например окончание предыдущей программы может быть записано в виде mov cx,LEN несмотря на то, что массив Всё O.K. будет rep movsb скопирован в область памяти B800 A0 3 , на экран дисплея будет выведено ВёOK. Почему? 4. CMPSB осуществляет сравнение байта строки источника c адресом SI и байта строки приемника с адресом DI то есть производит вычитание SI - DI . Не путать с командой CMP DST, SRC в которой наоборот, производится вычитание источника из приемника.

Команда CMPSB неявно уменьшает CX на 1 и увеличивает SI и DI на 1, если DF 0. 5. REPZ или REPE префикс повторения.

Выполнение команды завершается, когда CX 0 или ZF 0. .DATA src DB To be, or not to be dst DB To be, or not to be len - dst len равно 19 .CODE cld DF 0 push ds совместить адреса pop es сегментов ds и es mov cx, len длину строки dst переслать в cx lea di, dst загрузить адрес смещение строки dst в DI lea si, src repe cmpsb сравнивать побайтно je equal если все байты совпали, то перейти к метке not cx если нет - вычислить номер несовпадающих байт add cx, len jmp notequal equal notequal В конце этого примера номер первого несовпадающего байта CX 5.