Fasm
FASM supports local variables using macros created by ad-hoc that come with FASM.
include 'win32ax.inc'
.code
start:
mov ax, 1
call foo
proc foo
;Local variables
locals
var1 dd ?
var2 dw ?
endl
;Use them as expected
mov eax, [var1]
lea ebx, [var2]
ret
endp
This is compiled 1 in
:00401000 66B80100 mov ax, 0001
:00401004 E800000000 call 00401009
:00401009 55 push ebp
:0040100A 89E5 mov ebp, esp
:0040100C 83EC08 sub esp, 00000008
:0040100F 8B45F8 mov eax, dword ptr [ebp-08]
:00401012 8D5DFC lea ebx, dword ptr [ebp-04]
:00401015 C9 leave
:00401016 C3 ret
NASM
NASM also supports local variables using the % local directive .
Quote from the manual:
silly_swap:
%push mycontext ; save the current context
%stacksize small ; tell NASM to use bp
%assign %$localsize 0 ; see text for explanation
%local old_ax:word, old_dx:word
enter %$localsize,0 ; see text for explanation
mov [old_ax],ax ; swap ax & bx
mov [old_dx],dx ; and swap dx & cx
mov ax,bx
mov dx,cx
mov bx,[old_ax]
mov cx,[old_dx]
leave ; restore old bp
ret ;
%pop ; restore original context
The variable is %$localsizeused internally with the directive %localand must be defined in the current context before the local% directive is used.
Other sloppy approaches
%define SUPER_VAR ebp-4
%define MEGA_VAR ebp-8
mov DWORD [SUPER_VAR], 0xf
mov DWORD [MEGA_VAR], 0xff
, .
:
%define SUPER_VAR 4
%define MEGA_VAR 8
mov DWORD [ebp-SUPER_VAR], 0xf
mov DWORD [ebp-MEGA_VAR], 0xff
[] .
vi. emacs?
mov DWORD [ebp-4], 0xf ;SUPER_VAR
mov DWORD [ebp-8], 0xff ;MEGA_VAR
( , ).
2 , .
, : , , C, , . Au contraire, , .
, . .
, FASM NASM .
1 ...
2 , . , , , / .