Цитата:
Глобальные переменные - это зло - но как бороться - не понятно. Правильно может для доступа к ним использовать код .
Это небольшое зло. И бороться очень легко, в правильном ассемблере есть служебные команды или макросы для создания функций и локальных переменных и параметров.
Пример от фирмы Borland.
Код:
; Insert standard procedure
; Insert(S,D,I) = Copy(D,1,I-1) + S + Copy(D,I,255)
SInsert:
ARG SourceP,DWORD,1
ARG DestP,DWORD,1
ARG DestLen,WORD,1
ARG Index,WORD,1
LOC Temp1,BYTE,256
LOC Temp2,BYTE,256
ENTRY FAR
CMP Index,1
JGE @@1
MOV Index,1
@@1: LEA DI,Temp1
PUSH SS
PUSH DI
LES DI,DestP
PUSH ES
PUSH DI
MOV AX,1
PUSH AX
MOV AX,Index
DEC AX
PUSH AX
PUSH CS
CALL SCopy
LES DI,SourceP
PUSH ES
PUSH DI
PUSH CS
CALL SConcat
LEA DI,Temp2
PUSH SS
PUSH DI
LES DI,DestP
PUSH ES
PUSH DI
PUSH Index
MOV AX,255
PUSH AX
PUSH CS
CALL SCopy
PUSH CS
CALL SConcat
LES DI,DestP
PUSH ES
PUSH DI
PUSH DestLen
PUSH CS
CALL SStore
EXIT
Макросы для старого компилятора в новом уже есть служебные слова, в справке описано.
Код:
; *******************************************************
; * *
; * MACROS *
; * *
; *******************************************************
LOCALS @@
; Public variable definition macro
VAR MACRO Symbol,SType,Count
PUBLIC Symbol
Symbol LABEL SType
IF Count
DB SType * Count DUP(?)
ENDIF
ENDM
; Parameter definition macro
ARG MACRO Symbol,SType,Count
LOCAL Offset
@AP = @AP + SType * Count
Offset = @AP
Symbol EQU (SType PTR [BP+@AF-Offset])
ENDM
@AP = 0
@AF = 0
; Local variables definition macro
LOC MACRO Symbol,SType,Count
LOCAL Offset
@LP = @LP + SType * Count
Offset = @LP
Symbol EQU (SType PTR [BP+@LF-Offset])
ENDM
@LP = 0
@LF = 0
; Stack frame modifiers
sfFar EQU 01H ;FAR frame
sfMarkBP EQU 02H ;Make saved BP odd
sfSaveDS EQU 04H ;Save DS at [BP-2]
sfInitDS EQU 08H ;Init DS using SS
; Default stack frame type
sfDefault = 0
; Stack frame types
IF WindowsVersion
WINFAR EQU sfFar+sfMarkBP+sfSaveDS
ELSE
WINFAR EQU sfFar
ENDIF
; Entry code generation macro
ENTRY MACRO FrameType
IFB <FrameType>
@SF = sfDefault
ELSE
IFIDNI <FrameType>,<NEAR>
@SF = 0
ELSE
IFIDNI <FrameType>,<FAR>
@SF = sfFar
ELSE
@SF = FrameType
ENDIF
ENDIF
ENDIF
IF @SF AND sfMarkBP
INC BP
ENDIF
PUSH BP
MOV BP,SP
IF @SF AND sfFar
@AF = @AP + 6
ELSE
@AF = @AP + 4
ENDIF
IF @SF AND sfSaveDS
PUSH DS
@LF = -2
ELSE
@LF = 0
ENDIF
IF @LP
SUB SP,@LP
ENDIF
IF @SF AND sfInitDS
PUSH DS
PUSH SS
POP DS
ENDIF
ENDM
; Exit code generation macro
EXIT MACRO ArgSize
IF @SF AND sfInitDS
POP DS
ENDIF
IF @LF - @LP
MOV SP,BP
ENDIF
POP BP
IF @SF AND sfMarkBP
DEC BP
ENDIF
IFNB <ArgSize>
@AP = ArgSize
ENDIF
IF @SF AND sfFar
RETF @AP
ELSE
RETN @AP
ENDIF
@AP = 0
@LP = 0
ENDM
В современном компиляторе используется уже служебные слова proc endp arg,local, компилятора под рукой нет пример не привожу.