2014-02-13 139 views
0

我正在學習彙編,需要創建2個數組。對於第一個,我添加了2,然後打印這些值。第二個我減去2並打印。這些價值觀是正確的。當我嘗試交換值時,我會得到稍微偏離的數字值。我換換錯了嗎?交換匯編

.586 
.MODEL FLAT 

INCLUDE io.h   ; header file for input/output 

.STACK 4096 

.DATA 

array1 DWORD 21H,22H,23H,24H,25H 
array2 DWORD 31H,32H,33H,34H,35H 

resultLbl1 BYTE "Array 1 values are",0 
resultLbl2 BYTE "Array1 value1 is",0 
resultLbl3 BYTE "Array1 value2 is",0 
resultLbl4 BYTE "Array1 value3 is",0 
resultLbl5 BYTE "Array1 value4 is",0 
resultLbl6 BYTE "Array1 value5 is",0 
string1 BYTE 40 DUP (?) 
count DWORD 0 

.CODE 
_MainProc PROC 





     ;add 2 to array1 elements 

     mov eax, array1 
     add eax, 2 
     dtoa string1, eax 
     output resultLbl1, string1 

     mov eax, array1+4 
     add eax, 2 
     dtoa string1, eax 
     output resultLbl1, string1 

     mov eax, array1+8 
     add eax, 2 
     dtoa string1, eax 
     output resultLbl1, string1 

     mov eax, array1+12 
     add eax, 2 
     dtoa string1, eax 
     output resultLbl1, string1 

     mov eax, array1+16 
     add eax, 2 
     dtoa string1, eax 
     output resultLbl1, string1 


     ;subtract 2 from array2 elements 


     mov eax, array2 
     sub eax, 2 
     dtoa string1, eax 
     output resultLbl1, string1 

     mov eax, array2+4 
     sub eax, 2 
     dtoa string1, eax 
     output resultLbl1, string1 

     mov eax, array2+8 
     sub eax, 2 
     dtoa string1, eax 
     output resultLbl1, string1 

     mov eax, array2+12 
     sub eax, 2 
     dtoa string1, eax 
     output resultLbl1, string1 

     mov eax, array2+16 
     sub eax, 2 
     dtoa string1, eax 
     output resultLbl1, string1 


     ;Swap array values in reverse 


     mov eax, array2+16 
     xchg array1, eax 

     mov eax, array2+12 
     xchg array1+4, eax 

     mov eax, array2+8 
     xchg array1+8, eax 

     mov eax, array2+4 
     xchg array1+12, eax 

     mov eax, array2+4 
     xchg array1+12, eax 


     mov eax, array2 
     xchg array1+16, eax 

     mov eax, array1 
     dtoa string1, eax 

     output resultLbl2, string1 

     mov eax, array1+4 
     dtoa string1, eax 

     output resultLbl3, string1 


     mov  eax, 0 ; exit with return code 0 
     ret 
_MainProc ENDP 
END        ; end of source code 

回答

1

它看起來像你的xchg使用是錯誤的。首先是因爲xchg只爲eax寫入該值才被下一條指令殺死,第二條因爲xchg帶有內存參數有一個(浪費的)隱式鎖前綴。

你應該使用明確的臨時變量來代替:

mov eax, array1 
mov edx, array2+16 
mov array2+16, eax 
mov array1, edx 

線條

mov eax, array2+4 
xchg array1+12, eax 

也被複制,這是可疑的。

+0

對於xchg的鎖可能不會執行任何操作,除非正在使用支持多個共享內存總線的處理器的Xeon或其他服務器cpu。 – rcgldr

+0

命中並且沒有足夠快地編輯它。我的理解是,鎖定握手邏輯已禁用或從英特爾臺式機處理器中刪除。英特爾臺式機主板也不支持它。在臺式機處理器和主板上使用xchg時,似乎不太可能有任何額外的「鎖定」開銷。 – rcgldr

+0

另一種情況是,鎖由進程中的多個線程或多個共享內存的進程使用。假設這是一個單線程的進程,該鎖不應該引起額外的開銷。 – rcgldr

0

程序將array2的值移動到array1中,但需要第二個mov將array1的值移動到array2中。正如gsg所指出的那樣,使用xchg比使用mov需要更多的時間,所以我更新了這段代碼片段以使用mov。

mov  eax,array2+16 
    mov  edx,array1 
    mov  array1,eax 
    mov  array2+16,edx 
    mov  eax,array2+12 
    mov  edx,array1+4 
    mov  array1+4,eax 
    mov  array2+12,edx 
    mov  eax,array2+8 
    mov  edx,array1+8 
    mov  array1+8,eax 
    mov  array2+8,edx 
    mov  eax,array2+4 
    mov  edx,array1+12 
    mov  array1+12,eax 
    mov  array2+4,edx 
    mov  eax,array2 
    mov  edx,array1+16 
    mov  array1+16,eax 
    mov  array2,edx