我正在學習彙編,需要創建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
對於xchg的鎖可能不會執行任何操作,除非正在使用支持多個共享內存總線的處理器的Xeon或其他服務器cpu。 – rcgldr
命中並且沒有足夠快地編輯它。我的理解是,鎖定握手邏輯已禁用或從英特爾臺式機處理器中刪除。英特爾臺式機主板也不支持它。在臺式機處理器和主板上使用xchg時,似乎不太可能有任何額外的「鎖定」開銷。 – rcgldr
另一種情況是,鎖由進程中的多個線程或多個共享內存的進程使用。假設這是一個單線程的進程,該鎖不應該引起額外的開銷。 – rcgldr