.1. X86 7 6 4 2 0
SFZF AF PF CFThis instruction is often used inFPU-related code.SBB(subtraction with borrow) subtract values,decrementthe result if the CF flag is set. SBB is often
used for subtraction of large values, for example, to subtract two 64-bit values in 32-bit environment
using two SUB and SBB instructions. For example:
; work with 64-bit values: subtract val2 from val1.
; .lo means lowest 32 bits, .hi means highest.
SUB val1.lo, val2.lo
SBB val1.hi, val2.hi ; use CF set or cleared at the previous instructionOne more example:1.28 on page 396.SCASB/SCASW/SCASD/SCASQ(M) compare byte/ 16-bit word/ 32-bit word/ 64-bit word that’s stored in
AX/EAX/RAX with a variable whose address is in DI/EDI/RDI. Set flags asCMPdoes.
This instruction is often used with the REPNE prefix: continue to scan the buffer until a special value
stored in AX/EAX/RAX is found. Hence “NE” in REPNE: continue to scan while the compared values
are not equal and stop when equal.It is often used like the strlen() C standard function, to determine anASCIIZstring’s length:Example:lea edi, string
mov ecx, 0FFFFFFFFh ; scan 232 − 1 bytes, i.e., almostinfinitely
xor eax, eax ; 0 is the terminator
repne scasb
add edi, 0FFFFFFFFh ; correct it; now EDI points to the last character of the ASCIIZ string.; lets determine string length
; current ECX = -1-strlennot ecx
dec ecx; now ECX contain string lengthIf we use a different AX/EAX/RAX value, the function acts like the memchr() standard C function, i.e.,
it finds a specific byte.SHLshift value left
SHRshift value right:
7 6 5 4 3 2 1 0CF 7 6 5 4 3 2 1 0 07 6 5 4 3 2 1 00 7 6 5 4 3 2 1 0 CFThese instructions are frequently used for multiplication and division by 2 n. Another very frequent
application is processing bit fields:1.22 on page 304.SHRDop1, op2, op3: shift value in op2 right by op3 bits, taking bits from op1.
Example:1.28 on page 396.STOSB/STOSW/STOSD/STOSQstore byte/ 16-bit word/ 32-bit word/ 64-bit word from AX/EAX/RAX into
the address which is in DI/EDI/RDI.