1)是的,如果你閱讀一個值。如果您正在編寫一個值,那麼位置0x104中的內容無關緊要,它將被覆蓋。
2)否。您的代碼首先破壞目標內存位置中的值, 通過將內存位置的地址存儲在內存位置中。
[我的閱讀彙編符號時出現了一些混淆:在很多彙編程序中,只寫「eax」,而不是「%eax」;這些不是不同的寄存器。我不知道你是否正在編寫這個程序,因爲你的彙編程序要求你這樣做[[你正在使用哪個彙編程序?]],或者這只是一個錯字。在何種後續,我總是用裸註冊名,在 MASM彙編語法]
要交換兩個位置,你很可能需要在原有兩個 某個地方暫時存放原始值:
mov ecx, [eax] ; fetch memory specified by address in eax
mov edx, [ebx] ; fetch memory specified by address in ebx
mov [eax], edx ; put 2nd value where 1st used to be
mov [ebx], ecx ; put 1st value where 2nd used to be
如果您正在「交換」寄存器(例如,克,EAX和EBX),你可以只用一個臨時得到:
mov ecx, eax ; save 1st value in temp location ecx
mov eax, ebx ; set 1st value to 2nd location
mov ebx, ecx ; set 2nd value to copy of 1st value
x86的有一個特殊的「XCHG」指令,這使得這個簡單:
xchg eax, ebx ; exchange eax with ebx
可以說是使用上內存位置:
mov ecx, [eax] ; save 1st value in temporary ecx
xchg ecx, [ebx] ; swap with 2nd value
mov [eax], ecx ; set 2nd value to swapped temp
不幸的是,XCHG與存儲器位置使用包括自由隱LOCK,用於進行多處理器同步,這使得該代碼 人比上面的第一個解決方案慢。
1)是的。 2)號(即使忽略了缺失的逗號。) –