2016-03-10 68 views
-1

我想在組件中反轉數組,但是我無法成功地這樣做。該程序工作正常雙字,但現在不工作的話。我使用visual studio調試器進行了檢查。最後的結果是98,78,10,00,36這是錯誤的。我的代碼是在組件中反轉數組(masm)

.386 
.model flat,stdcall 
ExitProcess PROTO,dwExitCode:DWORD 
.data 

intarray WORD 10h,20h,36h,78h,98h 

.code 
main PROC 


mov esi,OFFSET intarray 
mov edi,OFFSET intarray 
add edi,SIZEOF intarray 
sub edi,TYPE intarray 
mov ecx,LENGTHOF intarray/2 




L1: 
mov eax,[ESI] 
mov ebx,[EDI] 
mov [EDI],eax 
mov[ESI],ebx 
add esi,TYPE intarray 
sub edi,TYPE intarray 
loop L1 

invoke ExitProcess,0 
main ENDP 
END main 
+0

嘗試搜索這個[非常常見的問題( http://stackoverflow.com/search?q=reverse+array+%5Bassembly%5D)。你的代碼中的一個錯誤是你正在加載/存儲雙字,但是你的數組是單詞。 –

+0

我沒有在任何地方找到它。 –

+0

這就是爲什麼我問。我不只是「愛」提問。 –

回答

2

您正在移動DWORDS(4個字節)。一個字是2個字節。

你應該代碼更改爲類似得到正確的結果:

mov ax,[ESI] 
mov bx,[EDI] 
mov [EDI],ax 
mov [ESI],bx 

或與一個指令,一個寄存器較少:

mov ax,[ESI] 
xchg ax,[EDI] 
mov [ESI],ax 
+0

你爲什麼會建議帶內存的'xchg'?它有一個隱含的'lock'前綴。您不需要對此進行緩慢的原子讀取 - 修改 - 寫入,因此使用具有單獨加載/存儲(具有合適大小)的現有代碼要快得多。 –

+2

它減少了6個字節,並且使用了少一個寄存器。不同的代碼序列有不同的應用。 – Michael