0
var1 db 20
;--------code 1-------
lea bx, var1
mov byte ptr[bx],40
;--------code 2-------
lea bx,var1
mov [bx], 40
これはどちらも有効ですか?同じですか?はいの場合は、バイトptrを使用する理由は何ですか?これらのコードはどちらも同じことでしょうか?
var1 db 20
;--------code 1-------
lea bx, var1
mov byte ptr[bx],40
;--------code 2-------
lea bx,var1
mov [bx], 40
これはどちらも有効ですか?同じですか?はいの場合は、バイトptrを使用する理由は何ですか?これらのコードはどちらも同じことでしょうか?
いいえ、そうではありません。
最初のコードには、サイズ指定子:byte ptr
が含まれています。これがなければ、アセンブラにソースとデスティネーションのサイズに関するヒントを与えることはありません。 の状況(例えば、コードの全体的なアセンブリを制御するさまざまな指令)が同じように実行されることがわかっている間は、これは頼りにされません。
曖昧に思えるかもしれないのは、サイズ指定なしでmov var1, 40
と書かれている可能性があるということです。しかし、生成されたコードを逆アセンブルする場合は、アセンブラが、var1 db
行のヒントを使用してシーンの背後にある問題を処理したことがわかります。これは、ワード、ワードなどではなくバイトであることを示します。
mov byte ptr [var1], 40
_ "blを取ることができるバイトを変更したければ" _あなたは 'mov [bl]、40'を意味しますか?それは妥当ではなく、たとえそれが同じであっても同じ意味を持ちません。 – Michael
_ "これらのコードはどちらも同じことをしますか?"いくつかのアセンブラはそれらを同じように扱い、あるものはそうでないかもしれない。 immediate 40のサイズは不明です。これが 'byte ptr'が使われている理由です。 – Michael
'byte ptr'を明示的に使って* byte *を移動すると、アセンブラは移動されるデータのサイズを推測しなければならず、あなたのケースで間違ったサイズ(ワードのように16ビット) 。 –