EQU
項目は変数ではありません、彼らは、任意のメモリ空間を取ることはありません。
- 一定値に
EQU
referesが、それはその値の同義語になったとき。試しても変更しなくても、この値を上書きすることはできません。
EQU
が別の変数にreferesすると、その変数の同義語になります。したがって、同義語に起こることはすべて変数に起こります。 EMU8086で
コピー&ペースト次のコードと実行:[bp+2]
の場合
.model small
.stack 100h
.data
xyz DW 2016 ;◄■■■ ABC IS NOT A VARIABLE, IT IS
abc EQU xyz ; JUST A SYNONYM FOR XYZ.
pqr EQU 10 ;◄■■■ PQR IS NOT A VARIABLE, IT IS
; JUST A SNYNONYM FOR NUMBER 10.
varA EQU [bp+2] ;◄■■■ BP POINTS TO GARBAGE.
.code
mov ax, @data
mov ds, ax
mov abc, 25 ;◄■■■ XYZ BECOMES 25!!!!
mov pqr, 999 ;◄■■■ NO ERROR, BUT THE VALUE WILL NOT CHANGE.
mov ax, pqr ;◄■■■ AX IS NOT 999, AX=10.
mov si, varA ;◄■■■ GARBAGE.
mov bp, sp
mov si, varA ;◄■■■ DIFFERENT GARBAGE.
push ax ;◄■■■ PUSH 10.
call my_proc
mov ax, NUMBER ;◄■■■ YES, EQUS ARE GLOBAL!!! (AX=0B9H).
mov ax, 4c00h
int 21h
;-----------------------------------------
my_proc proc
mov bp, sp
mov si, varA ;◄■■■ WRONG VALUE (ANOTHER GARBAGE).
mov si, [bp+2] ;◄■■■ PROPER VALUE (10).
varB EQU [bp+2]
mov si, varB ;◄■■■ WRONG AGAIN.
NUMBER EQU 0b9h ;◄■■■ DEFINE EQU INSIDE PROCEDURE.
ret
my_proc endp
をそれだけでコンパイラが一定の値を取得することはできませんおそらくので、動作するようには思えません。
使用している実際のアセンブラによって異なります。それはemu8086ですか?それから私は知らない。しかし、x86アセンブラのほとんどはプリプロセッサを持っていません。そのような場合のEQUは定義時に評価され、置き換えられません。そして、私は99%のようなあなたの場合もそうだと思います。プリプロセッサには、Cコンパイラのプリプロセッサ(あるいはスタンドアロンのものもありますが、常にgccがありますので、C言語のために用意されています)を実行してください。 – Ped7g
ええ、私はそれを得た。アセンブリにプリプロセッサのようなものはありますか?実際にそれが必要でしょうか? – luka032
EQUがグローバルであることを示すために私の答えを編集しました(プロシージャ内でEQUが宣言されました)。 –