2

私はアセンブリが初めてで、MASM を使用しています。これらのコード行を見て、何が違うのだろうと思います

a) push myVar

b) push [myVar]

c) push OFFSET myVar

彼らが myVar の値またはアドレスをプッシュしているかどうかを知るにはどうすればよいですか ありがとうございます!

よろしくお願いします

4

3 に答える 3

4

push myVar変数をスタックにプッシュするだけです。

push [myVar]あなたのvarを逆参照しています。myVar がポインターの場合、このコードはスタック上のアドレスに値をプッシュします。

最後のものについてはわかりませんが、逆のように見え、アドレスをスタックにpush OFFSET myVarプッシュしています。myVar

于 2013-05-17T08:27:05.160 に答える
3

使用するアセンブラによって異なります。MASM/TASM では、最初の 2 つのバリアントは同じことを行います (の値をmyVarスタックにプッシュします)。一方、3 番目のバリアントは のアドレスをmyVarスタックにプッシュします (セグメント化モードでは、現在のセグメント内のオフセットになります)。

つまり、MASM/TASM は、変数の実効アドレスを角かっこなしで記述したとしても、その実効アドレスを逆参照することを前提としています。ただし、アドレス/オペランドとして即値がある場合は違いがあります。

pushd 0             ; push the dword value 0 onto the stack
push dword ptr [0]  ; push the dword at address 0 onto the stack
                    ; will likely crash your program

レジスタオペランドについても同様です。

push eax              ; push the value of eax onto the stack
push dword ptr [eax]  ; push the value at the address that eax points to

NASM では、最初の 2 つのバリアントを次のように記述します。

push dword [myVar]  ; assuming a dword variable

そして3番目として

push myVar
于 2013-05-17T08:48:57.630 に答える