Тема 9. Команди за обработка на низ от знаци (Верижни команди)
Оптималната текстообработка изисква елегантни функции за достъп и работа с низове от знаци, като: запомняне; извикване на елементи от низа; преместване; претърсване на низове.
За тези цели са предвидени следните специални инструкции с низове:
За запомняне на един елемент от низа:
STOS адрес_DST Запомняне на елемент в низ (поредица от знаци)
STOSB Запомняне на байт в низ
STOSW Запомняне на дума в низ
STOSD Запомняне на двойна дума в низ
(Store String Byte/ Word/ Double word operands)
Мнемоничен код: STOS низ_приемник
Действие: Прехвърля съдържанието на AL (респ. AX) в низ, адресиран чрез ES:DI.
При използването на инструкцията STOS асемблер се нуждае най-малко от едно име на низ, за да установи типа на низа. Името може да отпадне, ако се използват другите инструкции.
За преместване на един елемент от низ в регистъра AL, респ. AX:
LODS адрес_SRC Зареждане на елемент от низ (елемент от поредица от знаци)
(Load String)
LODSB Зареждане на байт от низ
(Load Byte of String)
LODSW Зареждане на дума от низ
(Load Word of String)
LODSD Зареждане на двойна дума от низ
(Load Dowble word of String)
Мнемоничен код: LODS низ_източник
Действие: Зарежда един байт (респ. дума или двойна дума) от низ-източник (адресиран чрез DS:SI, при LODSD – чрез DS:ESI) в AL (АX или EAX).
При използването на инструкцията LODS асемблер се нуждае най-малко от едно име на низ, за да установи типа на низа. Името може да отпадне, ако се използват другите инструкции.
За преместване на един елемент от низ от една клетка на паметта в друга:
MOVS DST, SRC Прехвърляне на елемент от низ (елемент от поредица от знаци)
(Move String)
MOVSB Прехвърляне на байт от низ
(Move Byte of String)
MOVSW Прехвърляне на дума от низ
(Move Word of String)
MOVSD Прехвърляне на двойна дума от низ (Move Double word of String)
Мнемоничен код: MOVS низ-приемник, низ-източник
Действие: Копира един байт (респ. дума или двойна дума) от низа-източник, адресиран чрез DS:SI (при MOVSD чрез DS:ESI), в адресираната чрез ES:DI (при MOVSD чрез ES:EDI) клетка от паметта.
При използването на инструкцията MOVS асемблер се нуждае най-малко от едно име на низ, за да установи типа на низа. Името може да отпадне, ако се използват другите инструкции.
За сравняване на един елемент от низ със съдържанието на AL, респ. AX:
SCAS адрес_DST Претърсване на низ
(Scan String)
SCASB Търсене на байт в низ
(Scan Byte-String)
SCASW Търсене на дума в низ
(Scan Word-String)
SCASD Търсене на двойна дума в низ
(Scan Double word-String)
Мнемоничен код: SCAS низ_1
Действие: Изважда един байт (респ. дума) от низа, адресиран чрез ES:DI, от AL (респ. от AX). Резултатът не се запомня, обаче флаговете се установяват съобразно с този резултат.
При използването на инструкцията SCAS асемблер се нуждае най-малко от едно име на низ, за да установи типа на низа. Името може да отпадне, ако се използват другите инструкции.
За поелементно сравняване на два низа
CMPS DST, SRC Сравняване на низове (поредица от знаци)
(Compare String)
CMPSB Сравняване на низове по байтове
(Compare Byte String)
CMPSW Сравняване на низове по думи
(Compare Word String)
CMPSD Сравняване на низове по двойни думи
(Compare Double word-String)
Мнемоничен код: CMPS низ_1, низ_2
Действие: Изважда елемент от низ_2 (адресиран чрез ES:DI) от елемент от низ 1 (адресиран чрез DS:SI) и установява флаговете. Съдържанията на низовете не се променят.
При използването на инструкцията CMPS асемблерът се нуждае най-малко от едно име на низ, за да установи типа на низа. Името може да отпадне, ако се използват другите инструкции.
При тези инструкции операндите-източници се адресират чрез регистрите DS:SI, а операндите-цели – посредством ES:DI. Необходимият адрес (адреси) на областта за низа-източник и/или низа-цел винаги трябва да бъдат заредени предварително в тези регистри. Отделните операции върху низовете протичат по следния начин:
Изпълнява се елементарната операция с низове. След това се променят съдържанията на SI и/или DI. Ако DF = 0, брои се възходящо, следователно низът се обработва в посока на нарастване на адресите на клетките от паметта, ако DF = 1, брои се обратно, низът се обработва следователно в посока на намаляване адресите на клетките от паметта.
Когато е с префикс за повторение като REP, операцията с низ се изпълнява повторно. При това броят на желаните повторения, т.е. дължината на низа от знаци, трябва да бъде записан предварително в CX. След всяка операция с низ съдържанието на CX намалява с единица. Цялата операция се повтаря дотогава, докато съдържанието на CX стане 0. Ако се приложи условен префикс за повтаряне като REPE/REPZ или REPNE/REPNZ с инструкцията SCAS или CMPS, се проверява едно допълнително условие: след проверка на нулевия флаг (ZF) повторението се прекъсва преждевременно, ако условието за повторение (равно, неравно и т.н.) не е вече изпълнено.
Състоянието на флаг DF може да се управлява с командите (без операнди):
CLD (Clear Direction Flag) — сваляне на флага за посока DF в 0.
STD (Set Direction Flag) — вдигане на флага за посока DF в 1.
INS/ INSB/ INSW/ INSD Въвеждане на елемент от низ от входно-изходен порт.
OUTS/ OUTSB/ OUTSW/ OUTSD Извеждане на елемент от низ във входно-изходен порт.
Пример: Фрагмент от програма, която извежда последователност от символи във входно-изходен порт с номер 378 (LPT1, Printer Port), съответстващ на принтера.
.data
str_pech db “Текст за печат”
.code
…
mov dx, 378h
lea di, str_pech
mov cx, 16
rep outsb
…
Сподели с приятели: |