6

アセンブラで明確なEQUディレクティブを作成するだけで問題が発生します (8086)。

abc EQU xyz

EQU は、コード内で xyz、xyz が表すもの、値などで見つかった場合、文字通り abc を交換しますか?

すなわち、私は書くことができますか?

varA EQU [bp+4]

mov ax, varA

もう 1 つの質問は、EQU をグローバルにアクセスすることです。つまり、EQU をプロシージャー外で定義して、それを使用するプロシージャー内で使用できますか?

4

3 に答える 3

9

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]おそらくコンパイラが固定値を取得できないため、うまくいかないようです。

于 2016-10-31T17:20:47.473 に答える
4

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 などの微妙なニュアンスがあり%、そうでないものもあります。

于 2016-10-31T17:09:40.230 に答える
3

一部のアセンブラは、適切なマクロをサポートしており、通常は内部でプリプロセッサとして機能するか、それに非常に近いものです。

それ以外の場合は、既にコメントで書いたように、C プリプロセッサを使用しないのはなぜですか? (これはスタンドアロン ツールです。任意のテキスト ファイルを前処理でき#defineます。and other を使用して asm ソースを拡張するだけです。残りのコンテンツは C ソースのように見える必要はありません。プリプロセッサは気にしません。ファイルを次のように処理します。 [任意の] テキスト ファイル)。

必要ですか?私はしません。私は経験不足のためだけに ASM で巨大なコードを作成しましたが、マクロ/プリプロセッサはその大きな間違いから私を救うことはできませんでした (それらはおそらくそれをあまり目立たなくし、より長期間にわたって耐えられるようにするでしょう)。

ASM では、教育上の理由やパフォーマンス/低レベルの目的で小さなコードのみを実行しますが、マクロ/プリプロセッサは、生成された命令をシャドーイングする抽象化レイヤーを追加します。から来る?"。私はすべての ASM 命令を手作業で記述することを好みます。なぜそれをそこに置いたかを知っているからです。ASM コードに驚きは必要ありません。ASM でバグのないコードを記述することは、すでに非常に困難です。

また、ASM での最近の作業のほとんどは 256B のイントロだったので、生成された各バイトについて本当に知らなければなりませんでした... :)

于 2016-10-31T16:54:59.310 に答える