background image

7-18 Vol. 1

PROGRAMMING WITH GENERAL-PURPOSE INSTRUCTIONS

The CALL (call procedure) and RET (return from procedure) instructions allow a jump from one procedure to 
another and a subsequent return to the calling procedure. EFLAGS register contents are automatically stored on 
the stack along with the return instruction pointer when the processor services an interrupt.
The INTO instruction raises the overflow exception if the OF flag is set. If the flag is clear, execution continues 
without raising the exception. This instruction allows software to access the overflow exception handler explicitly to 
check for overflow conditions.
The BOUND instruction compares a signed value against upper and lower bounds, and raises the “BOUND range 
exceeded” exception if the value is less than the lower bound or greater than the upper bound. This instruction is 
useful for operations such as checking an array index to make sure it falls within the range defined for the array.

7.3.8.5  

Software Interrupt Instructions in 64-bit Mode and Compatibility Mode

In 64-bit mode, the stack size is 8 bytes wide. IRET must pop 8-byte items off the stack. SS:RSP pops uncondition-
ally. BOUND is not supported.
In compatibility mode, SS:RSP is popped only if the CPL changes.

7.3.9 String 

Operations

The GP instructions includes a set of string instructions that are designed to access large data structures; these 
are introduced in Section 7.3.9.1. Section 7.3.9.2 describes how REP prefixes can be used with these instructions 
to perform more complex repeated string operations. Certain processors optimize repeated string operations 
with fast-string operation, as described in Section 7.3.9.3. Section 7.3.9.4 explains how string operations can be 
used in 64-bit mode.

7.3.9.1  

String Instructions

The MOVS (Move String), CMPS (Compare string), SCAS (Scan string), LODS (Load string), and STOS (Store 
string) instructions permit large data structures, such as alphanumeric character strings, to be moved and exam-
ined in memory. These instructions operate on individual elements in a string, which can be a byte, word, or 
doubleword. The string elements to be operated on are identified with the ESI (source string element) and EDI 
(destination string element) registers. Both of these registers contain absolute addresses (offsets into a segment) 
that point to a string element. 
By default, the ESI register addresses the segment identified with the DS segment register. A segment-override 
prefix allows the ESI register to be associated with the CS, SS, ES, FS, or GS segment register. The EDI register 
addresses the segment identified with the ES segment register; no segment override is allowed for the EDI register. 
The use of two different segment registers in the string instructions permits operations to be performed on strings 
located in different segments. Or by associating the ESI register with the ES segment register, both the source and 
destination strings can be located in the same segment. (This latter condition can also be achieved by loading the 
DS and ES segment registers with the same segment selector and allowing the ESI register to default to the DS 
register.)
The MOVS instruction moves the string element addressed by the ESI register to the location addressed by the EDI 
register. The assembler recognizes three “short forms” of this instruction, which specify the size of the string to be 
moved: MOVSB (move byte string), MOVSW (move word string), and MOVSD (move doubleword string).
The CMPS instruction subtracts the destination string element from the source string element and updates the 
status flags (CF, ZF, OF, SF, PF, and AF) in the EFLAGS register according to the results. Neither string element is 
written back to memory. The assembler recognizes three “short forms” of the CMPS instruction: CMPSB (compare 
byte strings), CMPSW (compare word strings), and CMPSD (compare doubleword strings).
The SCAS instruction subtracts the destination string element from the contents of the EAX, AX, or AL register 
(depending on operand length) and updates the status flags according to the results. The string element and 
register contents are not modified. The following “short forms” of the SCAS instruction specify the operand length: 
SCASB (scan byte string), SCASW (scan word string), and SCASD (scan doubleword string).
The LODS instruction loads the source string element identified by the ESI register into the EAX register (for a 
doubleword string), the AX register (for a word string), or the AL register (for a byte string). The “short forms” for