2016-10-31 16 views
4

アセンブラ(8086)でEQUディレクティブを明確にすることに問題があります。アセンブリ8086 EQU指令

abc EQU xyz 

んEQUは、文字通り、XYZとのコードで見たときに、どのようなxyzは、値などを表し、ABCを交換しますか?

つまり、書くことはできますか?

varA EQU [bp+4] 

mov ax, varA 

そしてEQUがグローバルにアクセスされる1つの以上の質問は、私は、手続きのうち、EQUを定義することができ、すなわち、および手順でそれを使用しますか?

+0

使用している実際のアセンブラによって異なります。それはemu8086ですか?それから私は知らない。しかし、x86アセンブラのほとんどはプリプロセッサを持っていません。そのような場合のEQUは定義時に評価され、置き換えられません。そして、私は99%のようなあなたの場合もそうだと思います。プリプロセッサには、Cコンパイラのプリプロセッサ(あるいはスタンドアロンのものもありますが、常にgccがありますので、C言語のために用意されています)を実行してください。 – Ped7g

+0

ええ、私はそれを得た。アセンブリにプリプロセッサのようなものはありますか?実際にそれが必要でしょうか? – luka032

+0

EQUがグローバルであることを示すために私の答えを編集しました(プロシージャ内でEQUが宣言されました)。 –

答えて

4

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   

をそれだけでコンパイラが一定の値を取得することはできませんおそらくので、動作するようには思えません。

+2

'varA EQU [bp + 2]'と 'varB EQU [bp + 2] 'を使って生成されたガベージは、EMU8086がそれらを受け入れてはいけない最初は同じです。エミュレータのもう一つの欠陥が見つかりました! +1あなたがEQUについて知る時間を取ったのを見てうれしいです。 – Fifoernik

+1

* mov pqr、999;◄■■■エラーはありませんが、値は変更されません。*私はEMU8086がこれを受け入れるという私の目を信じることができません!このエミュレータのクォークのリストはどこで終了しますか? –

3

アセンブラの中には、通常は内部的にプリプロセッサとして動作するものや、それに非常に近いものがあります。

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

あなたはそれが必要でしょうか?私はしません。私は経験が不足し、マクロ/プリプロセッサがその巨大な間違いから私を救うことができないので、ASMで膨大なコードを実行しました(おそらく、それはあまり明白でなく、より長い期間耐えられるでしょう)。

教育上の理由やパフォーマンス/低レベルの事柄のためにASMでコードを小規模なものにしている間、マクロ/プリプロセッサでは、生成された命令の抽象化シャドウイングレイヤーを追加するため、デバッグ中に "これはどこから来たのですか? "なぜ私はそれを置くのか知っているので、私はASMのコードを驚かせたくありません。ASMにバグのないコードを書くのはかなり難しいです。

は再度ASMの私の後半の作業のほとんどは、256Bのイントロだったので、私は実際に生成された各バイトを知っていた... :)

+0

私はあなたが256バイトしか持っていないAppleの[拡張カードROM]を書いたばかだと思う。彼らは記憶のために非常に緊張していたので、副作用を得るために別の指示の途中に分岐したコードを見た。 'RTS 'によってフォローされる別の分岐命令のオフセット' 0x38'であった。その '0x38'は' SEC'命令であり、丈夫なチャップはそこで分岐してキャリーセットを持つ 'RTS'を得る。 –

+0

@WeatherVane私は、自分がコードを変更するまでに至っていないことを謙虚に認めなければなりませんか?チェック。処理のためのデータとしてコード自体を使用していますか?チェック。しかし、部分的に再利用されたオペコードはそれを思い出すことはできません。それは面白い逸話ですね。私はアップルをしたことがありません[、そしてZX Spectrumのみ] – Ped7g

4

EQUは、単にそのためabc EQU xyz、xyzは以前に定義されている必要があり、平等を表し、 。 2番目の例で

は、それはあなたのコードが組み立てられた後に、オブジェクトダンプが

MOV斧を生じるそして

%define varA [bp+4] 

mov ax, varA 

のようにする必要がある、[BP + 4]

あなたは

Bubble equ varA 

mov bx, Bubble 
ような何かを行うことができ

とあなたが構文的なNASMなど微妙なニュアンスがありますが、[BP + 4]

一般的に、すべてのアセンブラは、同じように動作し、

のmov BXを取得したいが他の人がかもしれない、%が必要ですない。