X86 Assembly/Data Transfer
Some of the most important and most frequently used instructions are those that move data. Without them, there would be no way for registers or memory to even have anything in them to operate on.
Contents |
[edit] Data transfer instructions
[edit] Move
| mov src, dest | GAS Syntax |
| mov dest, src | Intel syntax |
Move
The mov instruction copies the src operand into the dest operand.
Operands
src
- Immediate
- Register
- Memory
dest
- Register
- Memory
Modified flags
- No FLAGS are modified by this instruction
Example
.data value: .long 2 .text .global _start _start: movl $6, %eax # %eax is now 6 movw %ax, value # value is now 6 movl $0, %ebx # %ebx is now 0 movb %al, %bl # %ebx is now 6 movl value, %ebx # %ebx is now 6 movl $value, %esi # %esi is now the address of value xorl %ebx, %ebx # %ebx is now 0 movw value(, %ebx, 1), %bx # %ebx is now 6 # Linux sys_exit mov $1, %eax xorl %ebx, %ebx int $0x80
[edit] Data Swap
| xchg src, dest | GAS Syntax |
| xchg dest, src | Intel syntax |
Exchange
The xchg instruction swaps the src operand with the dest operand.
If one of the operands is a memory address, then the operation has an implicit LOCK prefix, that is, the exchange operation is atomic. This can have a large performance penalty.
It's also worth noting that the common NOP (no op) instruction, 0x90, is the opcode for xchgl %eax, %eax.
Operands
src
- Register
- Memory
dest
- Register
- Memory
However, note that only one operand can be in memory: at least one has to be a register.
Modified flags
- No FLAGS are modified by this instruction
Example
.data value: .long 2 .text .global _start _start: movl $54, %ebx xorl %eax, %eax xchgl value, %ebx # %ebx is now 2 # value is now 54 xchgw %ax, value # Value is now 0 # %eax is now 54 xchgb %al, %bl # %ebx is now 54 # %eax is now 2 xchgw value(%eax), %ax # value is now 0x00020000 = 131072 # %eax is now 0 # Linux sys_exit mov $1, %eax xorl %ebx, %ebx int $0x80
[edit] Zero Extend
| movz src, dest | GAS Syntax |
| movzx dest, src | Intel syntax |
Move zero extend
The movz instruction copies the src operand in the dest operand and pads the remaining bits not provided by src with zeros (0).
This instruction is useful for copying an unsigned small value to a bigger register.
Operands
src
- Register
- Memory
dest
- Register
Modified flags
- No FLAGS are modified by this instruction
Example
.data
byteval:
.byte 204
.text
.global _start
_start:
movzbw byteval, %ax
# %eax is now 204
movzwl %ax, %ebx
# %ebx is now 204
movzbl byteval, %esi
# %esi is now 204
# Linux sys_exit
mov $1, %eax
xorl %ebx, %ebx
int $0x80
[edit] Sign Extend
| movs src, dest | GAS Syntax |
| movsx dest, src | Intel syntax |
Move sign extend.
The movs instruction copies the src operand in the dest operand and pads the remaining bits not provided by src the sign of src.
This instruction is useful for copying a signed small value to a bigger register.
Operands
src
- Register
- Memory
dest
- Register
Modified flags
- No FLAGS are modified by this instruction
Example
.data
byteval:
.byte -24 # = 0xe8
.text
.global _start
_start:
movsbw byteval, %ax
# %ax is now -24 = 0xffe8
movswl %ax, %ebx
# %ebx is now -24 = 0xffffffe8
movsbl byteval, %esi
# %esi is now -24 = 0xffffffe8
# Linux sys_exit
mov $1, %eax
xorl %ebx, %ebx
int $0x80
[edit] Move String
movsb
Move byte
The movsb instruction copies one byte from the memory location specified in esi to the location specified in edi. If the direction flag is cleared, then esi and edi are incremented after the operation. Otherwise, if the direction flag is set, then the pointers are decremented. In that case the copy would happen in the reverse direction, starting at the highest address and moving toward lower addresses until ecx is zero.
Operands
None.
Modified flags
- No FLAGS are modified by this instruction
Example
section .text ; copy mystr into mystr2 mov esi, mystr ; loads address of mystr into esi mov edi, mystr2 ; loads address of mystr2 into edi cld ; clear direction flag (forward) mov ecx,6 rep movsb ; copy six times section .bss mystr2: resb 6 section .data mystr db "Hello", 0x0
movsw
Move word
The movsw instruction copies one word (two bytes) from the location specified in esi to the location specified in edi. It basically does the same thing as movsb, except with words instead of bytes.
Operands
None.
Modified flags
- No FLAGS are modified by this instruction
Example
section .code ; copy mystr into mystr2 mov esi, mystr mov edi, mystr2 cld mov ecx,4 rep movsw ; mystr2 is now AaBbCca\0 section .bss mystr2: resb 8 section .data mystr db "AaBbCca", 0x0
[edit] Load Effective Address
| lea src, dest | GAS Syntax |
| lea dest, src | Intel syntax |
Load Effective Address
The lea instruction calculates the address of the src operand and loads it into the dest operand.
Operands
src
- Immediate
- Register
- Memory
dest
- Register
- Memory
Modified flags
- No FLAGS are modified by this instruction
Note Load Effective Address calculates its src operand in the same way as the mov instruction does, but rather than loading the contents of that address into the dest operand, it loads the address itself.
lea can be used not only for calculating addresses, but also general-purpose unsigned integer arithmetic (with the caveat and possible advantage that FLAGS are unmodified). This can be quite powerful, since the src operand can take up to 4 parameters: displacement, base register, offset register, scalar multiplier, e.g. [eax - 4 + edx * 4] (Intel syntax) or -4(%eax, %edx, 4) (GAS syntax).
[edit] Data transfer instructions of 8086 microprocessor
General purpose byte or word transfer instructions:
- MOV: copy byte or word from specified source to specified destination
- PUSH: copy specified word to top of stack.
- POP: copy word from top of stack to specified location
- PUSHA: copy all registers to stack
- POPA: copy words from stack to all registers.
- XCHG: Exchange bytes or exchange words
- XLAT: translate a byte in AL using a table in memory.
These are I/O port transfer instructions:
- IN: copy a byte or word from specific port to accumulator
- OUT: copy a byte or word from accumulator to specific port
Special address transfer Instructions:
- LEA: load effective address of operand into specified register
- LDS: load DS register and other specified register from memory
- LES: load ES register and other specified register from memory
Flag transfer instructions:
- LAHF: load AH with the low byte of flag register
- SAHF: Stores AH register to low byte of flag register
- PUSHF: copy flag register to top of stack
- POPF: copy top of stack word to flag register