私はアセンブリが初めてで、MASM を使用しています。これらのコード行を見て、何が違うのだろうと思います
a) push myVar
b) push [myVar]
c) push OFFSET myVar
彼らが myVar の値またはアドレスをプッシュしているかどうかを知るにはどうすればよいですか ありがとうございます!
よろしくお願いします
私はアセンブリが初めてで、MASM を使用しています。これらのコード行を見て、何が違うのだろうと思います
a) push myVar
b) push [myVar]
c) push OFFSET myVar
彼らが myVar の値またはアドレスをプッシュしているかどうかを知るにはどうすればよいですか ありがとうございます!
よろしくお願いします
push myVar
変数をスタックにプッシュするだけです。
push [myVar]
あなたのvarを逆参照しています。myVar がポインターの場合、このコードはスタック上のアドレスに値をプッシュします。
最後のものについてはわかりませんが、逆のように見え、アドレスをスタックにpush OFFSET myVar
プッシュしています。myVar
使用するアセンブラによって異なります。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