2015-05-28 53 views
2

我剛剛進入x86的一個系統類,並有幾個問題:x86:使用內存/交換值?

1)說我引用了一塊內存:

(%eax) 

括號中指明,我訪問內存而%eax表示我想訪問,即內存中的特定地址。因此,如果寄存器%eax存儲0x104,(%eax)將返回存儲在內存位置0x104的任何內容。它是否正確?

2)說我想交換存儲在(%eax)(%ebx)的值。這是我的 嘗試:

//store values in registers 
movl (%eax) eax 
movl (%ebx) ebx 

//store values in opposite registers from where they came originally 
movl ebx (%eax) 
movl eax (%ebx) 

這種看法合適?

感謝您的幫助, bclayman

+0

1)是的。 2)號(即使忽略了缺失的逗號。) –

回答

2

這不可能是正確的。

EAXEBX從包含內存位置開始。然後,您可以取消引用的內存,移動的實際值到同一個名字的寄存器:

MOVL (%EAX), EAX 
MOVL (%EBX), EBX 

EAXEBX不再包含內存地址;他們現在包含這些地址的內容。當您下一次這樣做:

MOVL EBX, (%EAX) 
MOVL EAX, (%EBX) 

你是從到任何存儲位置恰好等於它幾乎肯定不是你想要的,幾乎肯定無法交流值的那些值的那些存儲單元存儲的值。

這個如果內存位置本身存儲內存位置的值,這種方式沒有多大意義,唯一的方法是工作。

+0

我對第二部分有點困惑。前兩個語句似乎是我想要做的(將內存中的值存儲到寄存器中)。具體而言,我不確定你在這裏的含義:「你正在將這些內存位置的值存儲到恰好與這些值相等的內存位置」......謝謝! – bclayman

+1

@bclayman:也許它可能更好。這裏理解的關鍵是%EAX和EAX是相同的寄存器。例如,如果%EAX的原始值是0x104,並且地址0x104處的RAM中的數據是0x333,則執行'movl EAX,(%EAX)'將0x333的值存儲在RAM地址0x333處 – slebetman

+0

@slebetman嗯,所以如果EAX = = 0x104,(%EAX)是M [0x104] == 0x333,那麼爲什麼movl EAX,(%EAX)不會將值0x104移入RAM地址0x104?再次感謝! – bclayman

3

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,用於進行多處理器同步,這使得該代碼 人比上面的第一個解決方案慢。

+0

我認爲原來的海報是使用AT&T語法,它的前綴名是%,並顛倒了操作數的順序。 –

+0

啊哈。那麼,這是彙編程序的麻煩。每個人都發明自己的語法。 「%」是可選的,相當混亂,恕我直言。我認爲我的答案仍然存在,如果OP瞭解我的語法與他不同並且操作數順序相反: - } –

+0

在AT&T語法中,%不是可選的,但這兩個逗號都不是。 AT&T語法也使用'(%eax)'和MOVL,其中MASM使用'[eax]'和MOV DWORD PTR。 (MASM將'mov eax,(eax)'解釋爲'mov eax,eax'。) –