Низовите инструкции използват компактно кодиране, неявни операнди и извършват множество действия. Като неявни операнди се използват следните регистри и регистрови двойки:
- AL, AX, EAX, RAX (акумулатор): получател (LODS), източник (STOS, SCAS);
- CX, ECX, RCX – брояч на итерации (ако се използват префиксите REP);
- DX – В/И адрес (INS, OUTS);
- SI, ESI, RSI – адрес на източника. Комбинира се с DS, който може да се промени чрез префикс (LODS, OUTS, MOVS, CMPS);
- DI, EDI, RDI – адрес на получателя. Комбинира се винаги с ES, който не може да промени (STOS, INS, MOVS, CMPS, SCAS).
Всички низови инструкции използват автоинкрементно адресиране: след извършване на операцията използваните индексни регистри (eSI и/или eDI) се променят в зависимост от размера на операнда и в посока, определена от флага DF:
- Ако DF = 0, индексните регистри се преместват напред;
- Ако DF = 1, индексните регистри се преместват назад.
Тъй като операндите на инструкциите не се кодират, те може да не се указват, а размерът на операнда да се укаже чрез един от следните суфикси на инструкцията:
- B – байт (LODSB вместо LODS ByteVar);
- W – дума (LODSW вместо LODS WordVar);
- D – двойна дума (LODSD вместо LODS DWordVar);
- Q – четворна дума (LODSQ вместо LODS QWordVar).
По-нататък се дават само тези форми.
Низовите инструкции могат да имат префикс REP. Тогава инструкцията се изпълнява няколко пъти, като скоростта на изпълнението е по-висока, отколкото ако това бяха отделни инструкции. За разлика от инструкция LOOP, влизането в тези итерации с eCX = 0 е еквивалентно на NOP.
Препоръчва се използването на низови инструкции само с префикс REP или когато е от значение размерът на кода. Единични низови инструкции заемат повече време, отколкото емулацията им с прости (например в I80486 LODSB е 4 такта, а еквивалентната двойка MOV AL,[SI]/INC SI – само 2). Трябва да се има впредвид обаче, че LODSB е един байт, а еквивалентната двойка – три).
Всички средства на защитата остават в сила. |