Data Movement Instructions
Data Movement Instructions
Data Movement Instructions
(Summary)
MOV Revisited
• In this chapter, the MOV instruction introduces machine language instructions available with
various addressing modes and instructions.
• It may be necessary to interpret machine language programs generated by an assembler.
Machine Language
• Native binary code microprocessor uses as its instructions to control its operation.
–instructions vary in length from 1 to 13 bytes
• Over 100,000 variations of machine language instructions.
–there is no complete list of these variations
• Some bits in a machine language instruction are given; remaining bits are determined for each
variation of the instruction.
The Opcode
• Selects the operation (addition, subtraction, etc.,) performed by the microprocessor.
–either 1 or 2 bytes long for most instructions
• The figure illustrates the general form of the first opcode byte of many instructions.
–first 6 bits of the first byte are the binary opcode
–remaining 2 bits indicate the direction (D) of the data flow, and indicate whether the data are a
byte or a word (W)
This figure shows Byte 2 of many machine language instructions, showing the position of the MOD,
REG, and R/M fields.
MOD Field
• Specifies addressing mode (MOD) and whether a displacement is present with the selected type.
–If MOD field contains an 11, it selects the register addressing mode
–Register addressing specifies a register instead of a memory location, using the R/M field
• If the MOD field contains a 00, 01, or 10, the R/M field selects one of the data memory
addressing modes.
• All 8-bit displacements are sign-extended into 16-bit displacements when the processor executes
the instruction.
–if the 8-bit displacement is 00H–7FH (positive), it is sign-extended to 0000H–007FH before
adding to the offset address
–if the 8-bit displacement is 80H–FFH (negative), it is sign-extended to FF80H–FFFFH
• Some assembler programs do not use the 8bit displacements and in place default to all 16-bit
displacements.
Register Assignments
• Suppose a 2-byte instruction, 8BECH, appears in a machine language program.
– neither a 67H (operand address-size override prefix) nor a 66H (register-size override prefix)
appears as the first byte, thus the first byte is the opcode
• In 16-bit mode, this instruction is converted to binary and placed in the instruction format of
bytes 1 and 2, as illustrated in Figure 4–4.
This figure shows the 8BEC instruction placed into bytes 1 and 2 formats. This instruction is a MOV BP,
SP.
–D and W bits are a logic 1, so a word moves into the destination register specified in the REG
field
–REG field contains 101, indicating register BP, so the MOV instruction moves data into register
BP
language form.
–If the instruction changes to MOV DL, [DI+1], the MOD field changes to 01 for 8-bit
displacement
–first 2 bytes of the instruction remain the same
–instruction now becomes 8A55H instead of 8A15H
This figure shows the MOV [BP], DL instruction converted to binary machine language.
32-Bit Addressing Modes
• Found in 80386 and above.
–by running in 32-bit instruction mode or
–In 16-bit mode by using address-size prefix 67H
• A scaled-index byte indicates additional forms of scaled-index addressing.
–mainly used when two registers are added to specify the memory address in an instruction
• A scaled-index instruction has 215 (32K) possible combinations.
• Over 32,000 variations of the MOV instruction alone in the 80386 - Core2 microprocessors.
• Figure 4–8 shows the format of the scaled index byte as selected by a value of 100 in the R/M
field of an instruction when the 80386 and above use a 32-bit address.
• The leftmost 2 bits select a scaling factor (multiplier) of 1x, 2x, 4x, 8x.
• Scaled-index addressing can also use a single register multiplied by a scaling factor.
PUSH/POP
• Important instructions that store and retrieve data from the LIFO (last-in, first-out) stack memory.
• Six forms of the PUSH and POP instructions:
–register, memory, immediate
–segment register, flags, all registers
• The PUSH and POP immediate & PUSHA and POPA (all registers) available 80286 - Core2.
• Register addressing allows contents of any 16bit register to transfer to & from the stack.
• Memory-addressing PUSH and POP instructions store contents of a 16- or 32 bit memory
location on the stack or stack data into a memory location.
• Immediate addressing allows immediate data to be pushed onto the stack, but not popped off the
stack.
• Segment register addressing allows contents of any segment register to be pushed onto the stack
or removed from the stack.
–ES may be pushed, but data from the stack may never be popped into ES
• The flags may be pushed or popped from that stack.
–contents of all registers may be pushed or popped
PUSH
• Always transfers 2 bytes of data to the stack;
–80386 and above transfer 2 or 4 bytes
• PUSHA instruction copies contents of the internal register set, except the segment registers, to the
stack.
• PUSHA (push all) instruction copies the registers to the stack in the following order:
AX, CX, DX, BX, SP, BP, SI, and DI.
• PUSHF (push flags) instruction copies the contents of the flag register to the stack.
• PUSHAD and POPAD instructions push and pop the contents of the 32-bit register set in 80386 -
Pentium 4.
–PUSHA and POPA instructions do not function in the 64-bit mode of operation for the Pentium
4
This figure shows the effect of the PUSH AX instruction on ESP and stack memory locations 37FFH and
37FEH. This instruction is shown at the point after execution.
• PUSHA instruction pushes all the internal 16bit registers onto the stack, illustrated in 4–14.
–requires 16 bytes of stack memory space to store all eight 16-bit registers
• After all registers are pushed, the contents of the SP register are decremented by 16.
• PUSHA is very useful when the entire register set of 80286 and above must be saved.
• PUSHAD instruction places 32-bit register set on the stack in 80386 - Core2.
–PUSHAD requires 32 bytes of stack storage
This figure shows the operation of the PUSHA instruction, showing the location and order of stack data.
POP
• Performs the inverse operation of PUSH.
• POP removes data from the stack and places it in a target 16-bit register, segment register, or a
16-bit memory location.
–not available as an immediate POP
• POPF (pop flags) removes a 16-bit number from the stack and places it in the flag register;
–POPFD removes a 32-bit number from the stack and places it into the extended flag register
• POPA (pop all) removes 16 bytes of data from the stack and places them into the following
registers, in the order shown: DI, SI, BP, SP, BX, DX, CX, and AX.
–reverse order from placement on the stack by PUSHA instruction, causing the same data to
return to the same registers
• Figure 4–15 shows how the POP BX instruction removes data from the stack and places them
into register BX.
This figure shows the POP BX instruction, showing how data are removed from the stack. This
instruction is shown after execution.
LEA
• Loads a 16- or 32-bit register with the offset address of the data specified by the operand.
• Earlier examples presented by using the OFFSET directive.
–OFFSET performs same function as LEA instruction if the operand is a displacement
• LEA and MOV with OFFSET instructions are both the same length (3 bytes).
• Why is LEA instruction available if OFFSET accomplishes the same task?
–OFFSET functions with, and is more efficient than LEA instruction, for simple operands such as
LIST
–Microprocessor takes longer to execute the LEA BX, LIST instruction the MOV BX, OFFSET
LIST
• The MOV BX, OFFSET LIST instruction is actually assembled as a move immediate instruction
and is more efficient.
• This instruction transfers the 32-bit number, addressed by DI in the data segment, into the BX
and DS registers.
• LDS, LES, LFS, LGS, and LSS instructions obtain a new far address from memory.
–offset address appears first, followed by the segment address
• This format is used for storing all 32-bit memory addresses.
• A far address can be stored in memory by the assembler.
• The most useful of the load instructions is the LSS instruction.
–after executing some dummy instructions, the old stack area is reactivated by loading both SS
and SP with the LSS instruction
• CLI (disable interrupt) and STI (enable interrupt) instructions must be included to disable
interrupts.
DI and SI
• During execution of string instruction, memory accesses occur through DI and SI registers.
–DI offset address accesses data in the extra segment for all string instructions that use it
–SI offset address accesses data by default in the data segment
• Operating in 32-bit mode EDI and ESI registers are used in place of DI and SI.
–this allows string using any memory location in the entire 4G-byte protected mode address space
LODS
• Loads AL, AX, or EAX with data at segment offset address indexed by the SI register.
• A 1 is added to or subtracted from SI for a byte-sized LODS
• A 2 is added or subtracted for a word-sized LODS.
• A 4 is added or subtracted for a double word-sized LODS.
• The next figure shows the LODSW instruction.
This figure shows the operation of the LODSW instruction if DS=1000H, D=0,11000H,
11001H = A0. This instruction is shown after AX is loaded from memory, but before SI increments by 2.
STOS
• Stores AL, AX, or EAX at the extra segment memory location addressed by the DI register.
• STOSB (stores a byte) stores the byte in AL at the extra segment memory location addressed by
DI.
• STOSW (stores a word) stores AX in the memory location addressed by DI.
• After the byte (AL), word (AX), or doubleword (EAX) is stored, contents of DI increment or
decrement.
MOVS
• Transfers a byte, word, or doubleword a data segment addressed by SI to extra segment location
addressed by SI.
– pointers are incremented or decremented, as dictated by the direction flag
• Only the source operand (SI), located in the data segment may be overridden so another segment
may be used.
• The destination operand (DI) must always be located in the extra segment.
INS
• Transfers a byte, word, or doubleword of data from an I/O device into the extra segment memory
location addressed by the DI register.
–I/O address is contained in the DX register
• Useful for inputting a block of data from an external I/O device directly into the memory.
• One application transfers data from a disk drive to memory.
–disk drives are often considered and interfaced as I/O devices in a computer system
• Three basic forms of the INS.
• INSB inputs data from an 8-bit I/O device and stores it in a memory location indexed by SI.
• INSW instruction inputs 16-bit I/O data and stores it in a word-sized memory location.
• INSD instruction inputs a doubleword.
• These instructions can be repeated using the
REP prefix
–allows an entire block of input data to be stored in the memory from an I/O device
OUTS
• Transfers a byte, word, or doubleword of data from the data segment memory location address by
SI to an I/O device.
–I/O device addressed by the DX register as with the INS instruction
• In the 64-bit mode for Pentium 4 and Core2, there is no 64-bit output
–but the address in RSI is 64 bits wide
XCHG
• Exchanges contents of a register with any other register or memory location.
– cannot exchange segment registers or memory-to-memory data
• Exchanges are byte-, word-, or doubleword and use any addressing mode except immediate
addressing.
• XCHG using the 16-bit AX register with another 16-bit register, is most efficient exchange.
XLAT
• Converts the contents of the AL register into a number stored in a memory table.
–performs the direct table lookup technique often used to convert one code to another
• An XLAT instruction first adds the contents of AL to BX to form a memory address within the
data segment.
–copies the contents of this address into AL
–only instruction adding an 8-bit to a 16-bit number
This figure shows the operation of the XLAT instruction at the point just before 6DH is loaded into AL.
IN and OUT
• IN & OUT instructions perform I/O operations.
• Contents of AL, AX, or EAX are transferred only between I/O device and microprocessor.
–an IN instruction transfers data from an external I/O device into AL, AX, or EAX
–an OUT transfers data from AL, AX, or EAX to an external I/O device
• Only the 80386 and above contain EAX
• Often, instructions are stored in ROM.
–a fixed-port instruction stored in ROM has its port number permanently fixed because of the
nature of read-only memory
• A fixed-port address stored in RAM can be modified, but such a modification does not conform
to good programming practices.
• The port address appears on the address bus during an I/O operation.
• Two forms of I/O device (port) addressing:
• Fixed-port addressing allows data transfer between AL, AX, or EAX using an 8-bit I/O port
address.
–port number follows the instruction’s opcode
• Variable-port addressing allows data transfers between AL, AX, or EAX and a 16-bit port
address.
–the I/O port number is stored in register DX, which can be changed (varied) during the
execution of a program.
This figure shows the signals found in the microprocessor-based system for an OUT 19H,AX instruction.
BSWAP
• Takes the contents of any 32-bit register and swaps the first byte with the fourth, and the second
with the third.
– BSWAP (byte swap) is available only in 80486– Pentium 4 microprocessors
• This instruction is used to convert data between the big and little endian forms.
• In 64-bit operation for the Pentium 4, all 8 bytes in the selected operand are swapped.
CMOV
• Many variations of the CMOV instruction.
–these move the data only if the condition is true
• CMOVZ instruction moves data only if the result from some prior instruction was a zero.
–destination is limited to only a 16- or 32-bit register, but the source can be a 16- or 32-bit
register or memory location
• Because this is a new instruction, you cannot use it with the assembler unless the .686 switch is
added to the program
ASSEMBLER DETAIL
• The assembler can be used two ways:
–with models unique to a particular assembler
–with full-segment definitions that allow complete control over the assembly process and are
universal to all assemblers
• In most cases, the inline assembler found in Visual is used for developing assembly code for use
in a program
–occasions require separate assembly modules using the assembler
Directives
• Indicate how an operand or section of a program is to be processed by the assembler.
– some generate and store information in the memory; others do not
• The DB (define byte) directive stores bytes of data in the memory.
• BYTE PTR indicates the size of the data referenced by a pointer or index register.
• Complex sections of assembly code are still written using MASM.
Memory Organization
• The assembler uses two basic formats for developing software:
– one method uses models; the other uses full segment definitions
• Memory models are unique to MASM.
• The models are easier to use for simple tasks.
• The full-segment definitions offer better control over the assembly language task and are
recommended for complex programs.
Models
• There are many models available to the MASM assembler, ranging from tiny to huge.
• Special directives such as @DATA are used to identify various segments.
• Models are important with both Microsoft Visual and Borland development systems if assembly
language is included with programs.
Full-Segment Definitions
• Full-segment definitions are also used with the Borland and Microsoft environments for
procedures developed in assembly language.
• The names of the segments in this program can be changed to any name.
• Always include the group name ‘DATA’, so the Microsoft program CodeView can be used to
symbolically debug this software.
• To access CodeView, type CV, followed by the file name at the DOS command line; if operating
from Programmer’s WorkBench, select Debug under the Run menu.
• If the group name is not placed in a program, CodeView can still be used to debug a program, but
the program will not be debugged in symbolic form.