2011-12-14 19 views
0

では& Y(意味スワップ*(& y)と*(& X)の値と& xの値を入れ替える次機能を有するアセンブリ - スワップ機能 - なぜ機能しないのですか?

スワップ:

push EBP 
mov EBP,ESP 
mov EBX, [EBP+12] ; ebx = *x 
mov EAX, DWORD [EBX] ;eax = ebx = *x 
mov DWORD [EBP-4], EAX ; [ebp-4] = eax =*x 
mov EDX, [EBP+8] ; edx = *y 
mov EAX, DWORD [EDX] ; eax = *edx = *y 
mov DWORD [EBX], EAX ; ebx = eax = *y 
mov EAX, DWORD [EBP-4] ; eax = *x 
mov DWORD [EDX], EAX ; edx = *x 
pop EBP ; ebx = *y and edx = *x 
ret 
// call Swap 
push x 
push y 
call swap 

Iそれは働いていない理由を理解していなかった。 を私は。いただきましworngそれを理解する方法を説明したマークを追加しました?ありがとう。(私はそれの正しい実装を必要としない)

+0

これは非アトミックメモリアクセスです。これはスレッド環境で発生している可能性はありますか? –

+2

fwiw、スワップは 'xchg'で、あるいはすべてのregを保存したい場合でもスタック上でさえできます:' 'push [x]' '' '[' 'pop [x]' 'pop [y]' – Martin

答えて

3

Y [EBP-4]でdwordにアクセスするときに使用するスタックに実際にメモリを予約していません。これは、割り込みルーチン、シグナルハンドラ、プロシージャと呼ばれる非同期に上書きされる可能性があります。

コードではなく、このようにする必要があります:変数xyではなく、変数の値のアドレスをパラメータとしても

swap: 
push EBP 
mov EBP,ESP 

sub ESP, 4 ; reserve memory for a local variable at [EBP-4] 

mov EBX, [EBP+12] ; ebx = &x 
mov EAX, DWORD [EBX] ; eax = x 
mov DWORD [EBP-4], EAX ; [ebp-4] = eax = x 
mov EDX, [EBP+8] ; edx = &y 
mov EAX, DWORD [EDX] ; eax = y 
mov DWORD [EBX], EAX ; *&x = y 
mov EAX, DWORD [EBP-4] ; eax = x 
mov DWORD [EDX], EAX ; *&y = x 

leave ; remove locals, restore EBP 

ret 

、あなたが渡していることを確認してください。 push x + push yは、NASMのxyのアドレスを渡しますが、TASMとMASMではxyの値を渡します。

関連する問題