PROWAREtech
Intel IA-32 Assembly Tutorial - A Guide to the Basics of x86 Assembly - Page 04
Symbolic Constants
Symbolic constants are defined by the equal-sign directive like:
COUNT = 1000
mov eax,COUNT
Would generate this statement:
mov eax,1000
COUNT
is not a variable; it is a constant. The following would produce an error.
COUNT = 1000
mov COUNT,eax ;cannot do this
EQU directive associates a symbol name with an integer expression or text.
name EQU integer expression name EQU already defined symbol name EQU <text>
PI EQU <3.14159>
hello EQU <"HELLO",0>
.
.
.data
greeting BYTE hello
More on Instructions
Data Transfer Instructions
The MOV
instruction copies data from one location to another. The source and destination should be the same size. A DWORD
is unsigned 32-bits.
.data
var1 DWORD 9Ah
var2 DWORD ?
.code
mov eax,var1 ;this takes 1 clock cycle
mov var2,eax ;this takes 1 clock cycle
MOV
cannot copy from one memory location to another. It must copy to a register then to the second memory location.
mov var2,var1 ;CANNOT DO THIS!
The MOVZX
instruction copies data from a smaller location to a larger one (unsigned). A WORD
is unsigned 16-bits.
.data
var1 WORD 9Ah
var2 BYTE Ah
.code
movzx eax,bx ;this takes 3 clock cycles on a 486
movzx eax,var1 ;this takes 3 clock cycles on a 486
Like MOV
, MOVZX
cannot copy from one memory location to another.
movzx var1,var2 ;CANNOT DO THIS!
The MOVSX
instruction copies data from a smaller location to a larger one (signed). A SWORD
is signed 16-bits. A SBYTE
is signed 8-bits.
.data
var1 SWORD -100
var2 SBYTE -5
.code
movsx eax,bx ;this takes 3 clock cycles on a 486
movsx eax,var1 ;this takes 3 clock cycles on a 486
Like MOV
and MOVZX
, MOVSX
cannot copy from one memory location to another.
movsx var1,var2 ;CANNOT DO THIS!
The LAHF
and SAHF
instructions copy the low byte of the EFLAGS register to and from AH.
This is so that you can restore the EFLAGS register. Neither of these instructions take operands.
.data
savedflags BYTE ?
.code
lahf ;load eflags
mov savedflags,ah
.
.
.
mov ah,savedflags
sahf ;save eflags
The XCHG
instruction swaps the contents of two operands.
.data
var1 DWORD 10
var2 DWORD 5
.code
xchg eax,ebx ;this takes 3 clock cycles on a 486
xchg eax,var1 ;this takes 5 clock cycles on a 486
xchg var1,var2 ;CANNOT DO THIS!
Direct-offset operands add a displacement to the name of a variable which is needed for working with arrays.
.data
var1 DWORD 10,11,12
.code
mov eax,[var1+4] ;offset by 4 bytes so now eax equals 11