Методическое пособие для выполнения лабораторных работ и КР (1075934), страница 14
Текст из файла (страница 14)
В нашем случае нулевой символ в строке находится на 14-й позиции, поэтому первым сработает счетчик на регистре CX. Если вывести исходные данные в отладчике QC25, то увидим:&StringS,s "1234567890&StringD,s "$"$"Отладчик заканчивает вывод по нулевому символу.
После работы программы получим:&StringS,s "1234567890&StringD,s "1234567890$"$"Было скопировано ровно 10 байт. Если установить счетчик циклов СХ = 15, то получим:&StringS,s "1234567890&StringD,s "1234567890…MOV CX, 15…$"$"В этом случае циклы будут завершены по условию конца строки в источнике (14 символравен 0). Если СХ = 3, то получим:&StringS,s "1234567890&StringD,s "123…MOV CX, 15…$"$"Если признак направления установлен в 1 (командой STD), то при пересылке цепочки регистры DI и SI на каждом шаге будут уменьшаться. Пусть исходные строки дляперемещения имеют вид:STRINGS dbSTRINGD db'1234567890$',0'$',0Тогда можно выполнить следующий фрагмент программы:;MOVSBбайты обратное направление STDSTD; Направление STRINGS => STRINGDLEA DI, STRINGD + 9LEA SI, STRINGS + 9MOV CX, 8REPMOVSBТак как установлен признак направления в 1 (STD) перемещение будет выполняться смладших байтов цепочки.
Результат будет таким:&STRINGS,s "1234567890$"2010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”&STRINGD,s " 34567890$"62Если префикс REP перед командой MOVSB отсутствует, то команда будет выполненаодин раз. Например:CLD…MOV CX, 10; Если REP нет, то 1 разMOVSBРезультат будет таким:&STRINGS,s "1234567890&STRINGD,s "1$"$"Даже при установке регистра СХ в 10. Для управления командой MOVSB могут использоваться и другие префиксы: REPE/REPNE и REPZ/REPNZ.
Эти признаки ориентируютсяна значения передаваемых данных и для команды MOVS не действуют.Команда COMPSB и ее разновидности используется для сравнения цепочек байтовых чисел. Синтаксис команды:COMPSB <приемник> , <источник>ИлиCOMPSBПусть мы имеем описание двух строк, которые равны:StrsStrddbdbdbdb…'123$'0'123$0'Тогда, после выполнения фрагмента программы:; Команда CMPSBPUSH DSPOP ESCLDLEA DI, StrdLEA SI, StrsMOV CX, 10REPCMPSBJE M5XOR AX,AXM5:; Обязательная загрузка ESБудет выполнен переход на метку M5, так как будут сравниваться строки до появления висходной строке нулевого символа.
Если мы специально нарушим равенство строк, какэто сделано в следующем фрагменте:; CMPSBREPCLDLEA DI, StrdLEA SI, StrsMOV Strd + 1 ,'*'MOV CX, 10REPCMPSBJE M6XOR AX,AXM6:то переход на метку M6 не произойдет. При использовании префикса REPNE процесспроверки остановиться на первом отличном символе:; CMPSB REPNECLDLEA DI, StrdLEA SI, StrsMOV Strd + 1 ,'*'2010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”MOV CX, 10REPNECMPSBJNE M61XOR AX,AXM61:63в регистре СХ мы получим значение 9, которое показывает, что в строках равны толькопервые символы (10 - 9). После восстановления строки (возвращаем ‘2’ на место) припрефиксе REPE ( проверка эквивалентности строк) получим переход на метку М62:; CMPSB REPECLDLEA DI, StrdLEA SI, StrsMOV Strd + 1 ,'2'MOV CX, 10REPECMPSBJE M62XOR AX,AXM62:Команда SCASB и ее разновидности используется для поиска в цепочке значенияпомещенного в регистре AL(AX). Синтаксис команды:SCASB <приемник>ИлиSCASBПри поиске символа или числа (SCASW) в регистр AL (AX) предварительно заносим значение для поиска и выполняем команду с префиксом повторения:; SCASBREPCLDLEA DI, StrdMOV CX, 10MOV AL, '2'MOV CX , 10REPSCASBПосле ее выполнения в регистре DI получим адрес найденного символа.
Для следующейпрограммы с префиксом REPNE:; SCASBREPNECLDLEA DI, StrdMOV CX, 10MOV AL, '3'MOV CX , 10REPNESCASBВ DI получим значение адреса символа следующего после ‘3’.; SCASBREPECLDLEA DI, StrdMOV AL, '2'MOV CX , 10REPESCASBПри использовании REPE также в регистре DI получим адрес найденного символа.Команда LODSB и ее разновидности используется для загрузки в AL(AX) значенияиз цепочки символов. Синтаксис команды:LODSB <источник>ИлиLODSB; LODSCLD642010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”LEA SI, StrsLODSB; Загрузка 1-го байта строки в AL…LODSB; Загрузка 2-го байта строки в ALТакие команды можно использовать в цикле для последовательной обработки отдельныхсимволов (можно с успехом применить в 5-й ЛР) для обработки введенной строки.Команда STOSB и ее разновидности используется для записи в цепочку значенияиз AL(AX).
Синтаксис команды:STOSB <приемник>ИлиSTOSBПример фрагмента программы с повторением для записи в строку:; STOSBCLDLEA DI, StrdMOV AL , '#'MOV CX, 4REPSTOSBПосле выполнения данного фрагмента в строке Strd мы получим:&Strd,s ”####”Такие команды можно использовать в цикле для последовательной обработки отдельныхсимволов (можно с успехом применить в 5-й ЛР) для запоминания строки.16.3. MUL/IMUL и DIV/IDIVКоманды MUL/IMUL и DIV/IDIV используются для выполнения операций умножения и деления целых чисел.
Особенностью команды умножения является то, что полученный результат может иметь двойную размерность (8 - > 16 и 16 -> 32). Особенностьюкоманды деления является наличие двух результатов (частного и остатка). Это влияет навыполнение команд, в частности на использование регистров. Парные командыMUL/IMUL и DIV/IDIV отличаются учетом (IMUL, IDIV) или не учетом (MUL, DIV) знаков чисел при выполнении операций. Для примеров программ выполнения операций намнужны следующие описания:WORD1BYTE1REZREZOREZDDWDBDWDWDD100100000Команда для умножения MUL слов (16 бит)без учета знака имеет вид:; Тест командыMOV AX ,MOV BX ,MUL BXMOV WORDMOV WORDMUL10001000( на слово); умножениеPTR REZD , AXPTR REZD+2 , DXРезультат операции получается на двух регистрах: в AX – младшие байты, а на DX –старшие байты. Напомню, что в оперативной памяти они записаны в обратном порядке!Результат получается в виде:REZD,d 1000000Умножение слов можно выполнить с использованием переменной из памяти:; Память WORDMOV AX , 1000MUL WORD1; 100MOV WORD PTR REZD , AX2010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”MOV WORD PTR REZD+2 , DX65Результат получается в виде:REZD,d 100000При умножении на байтовую переменную в регистре (BL) результат должен поместитьсяв регистр слова (AX), при этом множимое расположено в регистре AL:; умножение на регистр BLXOR AX,AXMOV AL , 200MOV BL , 200MUL BLMOV REZ , AXРезультат получается в виде:REZ,u 40000Если после выполнения операции старший регистр не нулевой (AH != 0), то формируютсяфлаги OF (переполнения) и CF (переноса).
Значения этих флагов можно использовать вкомандах условной передачи управления. Можно умножать на байт из памяти, например:; ПамятьMOVMULMOVBYTEAL , 200BYTE1; 100REZ , AXРезультат получается в виде:REZ,u 20000Если при умножении важен знак, то нужно использовать команду IMUL. Например:;IMULсо знакомMOV AX , -100IMUL WORD1; 100MOV REZ , AXРезультат получается в виде:REZ,d -10000При знаковом умножении слов;IMUL словаMOV AX , -1000IMUL WORD1; 100MOV WORD PTR REZD , AXMOV WORD PTR REZD+2 , DXРезультат получается на регистрах AX:DX в виде:REZD,d -100000Команда деления может выполняться без учета знака (DIV) и с учетом знака(IDIV).
При операции короткого деления делимое располагается на регистре AX (16 бит),а делитель на заданном регистре размером 8 бит (в примере BL) или в памяти. Результатполучаем в регистрах AL(частное) и AH(остаток). В примере ниже:; DIVкороткоеMOV AX , 105MOV BL, 10DIV BLMOV REZCH , ALMOV REZOC , AHПолучим результат:REZCH,u 10REZOC,u 5При операции длинного деления делимое располагается на регистрах AX:DX (32бит), а делитель на заданном регистре размером 16бит (в примере BX).
Результат получаем в регистрах AX(частное) и DX(остаток). В примере ниже:; DIVдлинноеMOV AX , WORD PTR REZD; 100005 - DD2010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”MOV DX , WORD PTR REZD+2MOV WORD PTR REZD , AXMOV WORD PTR REZD+2 , DXMOV BX, 100DIV BXMOV REZOCD , DXMOV REZCHD , AX66Получим результат:REZCHD,u 1000REZOCD,u 5Операции деления выполняются и над знаковыми числами (IDIV), при этом знакустанавливается у частного.
Надеюсь, что Вы сами придумаете и отладите примеры дляизучения работы этой команды. Нужно также учитывать, что в современных микропроцессорах (старше 386) появились и новые возможности команд деления и умножения.Изучите эти возможности самостоятельно.16.4. Команды: TEST, CMP и ANDКоманды TEST, CMP и AND используются часто для подготовки ветвления в программах на языке Ассемблер.
Команда сравнения CMP позволяет сравнить два значения иподготавливает флаги для команды, следующей за ней. Это обычно команда условногоперехода (JE, JNE, JL и других). Пример ниже иллюстрирует сравнение двух байтовыхчисел (5 и 7) на регистре AL:; Команда CMPXOR AX,AXMOV AL , 5CMP AL, 7JNE M3MOV AH , 5M3:Так как числа неравны, то выполняется переход на метку M3.
В следующем примере:; Команда CMPXOR AX,AXMOV AL , 5CMP AL, 5JE M4MOV AH , 5M4:Числа равны (5 и 5) и в этом случае тоже выполняется переход но на метку М4.Команда AND является командой поразрядного логического умножения. В примере логического умножения:; Команда ANDXOR AX,AXMOV AL, 00AhAND AL, 0A0hJZ M1MOV AL, 0AhM1:После выполнения на регистре AL получится 0, поэтому выполнится переход на меткуМ1. Команда TEST работает также как и команда AND, но значение регистра не изменяется (не портится). Поэтому в примере:; Команда TESTXOR AX,AXMOV AL , 5TEST AL , 2JZ M2MOV AH , 52010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”67M2:Переход на метку М2 выполнен не будет, а значение регистра AL останется прежним.16.5.