[2009] Большаков С.А. - Методическое пособие по выполнению ЛР по СП (Всякие мелочи), страница 14
Описание файла
Файл "[2009] Большаков С.А. - Методическое пособие по выполнению ЛР по СП" внутри архива находится в папке "Всякие мелочи". PDF-файл из архива "Всякие мелочи", который расположен в категории "". Всё это находится в предмете "системное программирование" из 4 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "системное программирование" в общих файлах.
Просмотр PDF-файла онлайн
Текст 14 страницы из PDF
Завершение цикла повторений происходит при достижении значения истины любого из условий (в счетчике СХ 0 или достигнут конец строки).Ниже приводиться пример использования команды пересылки цепочки символов.Исходные строки в программе описаны так:STRINGS dbSTRINGD db'1234567890'$',0$',0Для пересылки данных используется следующий фрагмент:CLDPUSH DSPOP ESLEA DI,STRINGDLEA SI,STRINGSMOV CX, 10; Команда MOVSBREPMOVSB; Сброс флага направления;;;;Обязательная загрузка ESзагрузка адреса приемниказагрузка адреса источникаМаксимальное число повторенийВ программе первоначально устанавливается в 0 флаг направления.
Далее формируетсязначение сегментного регистра ES. В нашем случае пересылка выполняется в пределаходного сегмента, поэтому ES = DS. В принципе значение регистра ES может быть любым, то есть пересылка может быть между сегментами. Далее с помощью команды LEAформируются начальные адреса - смещения источника (SI) и приемника (DI) и заполняется число циклов CX=10. В нашем случае нулевой символ в строке находится на 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$"2009 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”&STRINGD,s " 34567890$"64Если префикс 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 ,'*'2009 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”MOV CX, 10REPNECMPSBJNE M61XOR AX,AXM61:65в регистре СХ мы получим значение 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; LODSCLD662009 год 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-й ЛР) для запоминания строки.15.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 , AX2009 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”MOV WORD PTR REZD+2 , DX67Результат получается в виде:REZD,d 1000000При умножении на байтовую переменную в регистре (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 - DD2009 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”MOV DX , WORD PTR REZD+2MOV WORD PTR REZD , AXMOV WORD PTR REZD+2 , DXMOV BX, 100DIV BXMOV REZOCD , DXMOV REZCHD , AX68Получим результат:REZCHD,u 1000REZOCD,u 5Операции деления выполняются и над знаковыми числами (IDIV), при этом знакустанавливается у частного.