2011-02-23 2 views
2

は非常にシンプルなアセンブリ言語プログラムのうち、次の2つのステートメントを考えてみましょう:それはバイトが-128小数を超えて保持できる必要があるためとしてアセンブラがこれについてエラーを報告しないのはなぜですか?

DATA1 DB +200 
DATA2 DB -130 

私はそれを組み立てるためにしようと、アセンブラは、NO 2文でエラーが発生します。しかし、アセンブラはなぜ1つのステートメントでエラーを出さなかったのですか? afterallでは、バイトは最大127正の符号付き整数を保持できます。代わりにassemlberはそのバイトに値C8を入れます。

答えて

3

任意の数は、実行可能ファイルに組み立てられたときにビットの配列に変換されます。たとえば、-1は0xFF、-2は0xFEなどです。-1と255の唯一の違いは、コード内での使用方法です。アセンブラは気にせず、使用するためのデータを保存するだけです。

+0

したがって、値+200を代入すると、アセンブラは符号ビットを気にせず、値200のビットの一部としてもmsbを使用しますか? – KawaiKx

+1

@Saurabh - 正しい例では、+は必要ありません。この場合、すべての整数は符号なしであるため、MSBは重要ではありません。 – Sparafusile

3

おそらく、リテラルが符号付きであるか符号なしであるかはわかりません。アセンブラの場合、私はあまりにも驚くべきことは見つけられません。どちらもユースケースがあります。

-130は、符号付きで-128より小さいため、決してバイトに収まらない。一方、200は、符号なしバイトにうまく収まり、アセンブラが行うビューのように見えます。符号なしバイトとして解釈された場合、0xC8は200です。

+0

を「ADDとSUB命令は、符号なしとデータを署名し、実際に区別しない、単にビットを加算および減算」私はアセンブラを伝えるために「+」記号を入れて符号付き整数であるにもかかわらず、それでも境界線には反対しませんでした。つまり、変数に値を代入している間に、宣言された変数の型の境界を超えてはならないということをプログラマに任せているということですか?もしそうなら、なぜこの機能をアセンブラに追加できないのですか? – KawaiKx

+1

@Saurabh - より高いレベルの言語で強いタイピングが必要な場合。アセンブリでは、すべてがBYTE、WORD、またはDWORDです。署名付きDWORD、符号なしDWORD、またはハンドルの唯一の違いは、それらの使用方法です。 – Sparafusile

+0

@Sparafusileが何を言っているかを補強する。アセンブリデータステートメントには、実際の "signed"と "unsigned"の値はありません。 "+200"は "200"と同じですが、これは1バイトで完全に合法です。 "-120"とすると、便宜的にアセンブラが適切な値に変わります。 "-130"は適合しないので、誤りです。 –

1

ので、要旨は次のとおりです。

フィールドの内容あなたがそれらを意味するつもりどんな意味。これの結末は、あなたのプログラムが処理する数値の大きさに関して良い考えを持っていなければならず、フィールドサイズを適切に定義しなければならないということです。

Peter Abelの「IBM PCアセンブリ言語とプログラミング」

また、同じ著者から

関連する問題