アセンブラで明確なEQUディレクティブを作成するだけで問題が発生します (8086)。
abc EQU xyz
EQU は、コード内で xyz、xyz が表すもの、値などで見つかった場合、文字通り abc を交換しますか?
すなわち、私は書くことができますか?
varA EQU [bp+4]
mov ax, varA
もう 1 つの質問は、EQU をグローバルにアクセスすることです。つまり、EQU をプロシージャー外で定義して、それを使用するプロシージャー内で使用できますか?
EQU項目は変数ではなく、メモリ空間を必要としません:
EQU、その値の同義語になります。この値は、変更しようとしても上書きできません。EQU別の変数を参照すると、その変数のシノニムになるため、シノニムに発生するすべてのことが変数に発生します。次のコードを EMU8086 にコピーして貼り付けて実行します。
.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
[bp+2]おそらくコンパイラが固定値を取得できないため、うまくいかないようです。
EQU は単に等しいことを表すためabc EQU xyz、xyz は事前に定義されている必要があります。
2番目の例では、次のようにする必要があります
%define varA [bp+4]
mov ax, varA
次に、コードがアセンブルされた後、オブジェクト ダンプが生成されます。
移動斧、[bp+4]
次に、次のようなことができます
Bubble equ varA
mov bx, Bubble
そして、あなたは得るでしょう
mov bx, [bp+4]
一般に、すべてのアセンブラは同じように動作しますが、構文的には NASM の require などの微妙なニュアンスがあり%、そうでないものもあります。
一部のアセンブラは、適切なマクロをサポートしており、通常は内部でプリプロセッサとして機能するか、それに非常に近いものです。
それ以外の場合は、既にコメントで書いたように、C プリプロセッサを使用しないのはなぜですか? (これはスタンドアロン ツールです。任意のテキスト ファイルを前処理でき#defineます。and other を使用して asm ソースを拡張するだけです。残りのコンテンツは C ソースのように見える必要はありません。プリプロセッサは気にしません。ファイルを次のように処理します。 [任意の] テキスト ファイル)。
必要ですか?私はしません。私は経験不足のためだけに ASM で巨大なコードを作成しましたが、マクロ/プリプロセッサはその大きな間違いから私を救うことはできませんでした (それらはおそらくそれをあまり目立たなくし、より長期間にわたって耐えられるようにするでしょう)。
ASM では、教育上の理由やパフォーマンス/低レベルの目的で小さなコードのみを実行しますが、マクロ/プリプロセッサは、生成された命令をシャドーイングする抽象化レイヤーを追加します。から来る?"。私はすべての ASM 命令を手作業で記述することを好みます。なぜそれをそこに置いたかを知っているからです。ASM コードに驚きは必要ありません。ASM でバグのないコードを記述することは、すでに非常に困難です。
また、ASM での最近の作業のほとんどは 256B のイントロだったので、生成された各バイトについて本当に知らなければなりませんでした... :)