SCAS Scan String Flags: O D I T S Z A P C * - - - * * * * * SCAS destination_string
Logic CMP accumulator,[ES:eDI] if DF = 0 eDI ← eDI + n ; n = 1 for byte, 2 for word, else ; 4 for dword (386+) eDI ← eDI - n endif
This instruction compares the contents of the AL, AX, or EAX register with the memory byte, word, or doubleword pointed to by ES and the destination-index register (DI or EDI). After the comparison, eDI is automatically incremented (if the direction flag is cleared) or decremented (if the direction flag is set), in preparation for comparing the next element of the string.
If the address-size attribute of SCAS is 16 bits, DI is used for the destination-index register; otherwise the the address-size attribute is 32 bits, and the EDI register will be used.
The destination segment must be addressable from the ES register; it cannot be changed with a segment override.
Note: This instruction is always translated by the assembler into SCASB, Scan String Byte, SCASW, Scan String Word, or SCASD, Scan String Dword, depending upon whether destination refers to a string of bytes, words or doublewords. In either case, you must explicitly load the eDI register with the offset of the destination string.
SCASB, SCASW, and SCASD are synonyms for the byte, word, and doubleword SCAS instructions that do not require an operand. They are simpler to use but provide no type or segment checking.
SCAS is usually preceded with a REP prefix for a block scan of CX or ECX bytes bytes, words, or doublewords.
Example: dataseg aname db "Frederik x" a_len = ($ - aname) codeseg mov di,ds mov es,di assume es:dgroup mov di,offset aname mov cx,a_len mov al,"x" cld ; Auto-increment di repne scasb ; Look for "x" jne not_found ; Can't use JCXZ dec di ; Point di to "x" mov [byte di],"X" ;... not_found:
Opcode Format AE SCAS m8 ; = SCASB AF SCAS m16 ; = SCASW AF SCAS m32 ; = SCASD