[英]How to reverse an array is assembly?
我正在嘗試編寫一個簡單的程序來反轉數組。 它幾乎有效,無論如何它適用於陣列的前半部分。 中間的項總是“0”,然后它返回到模式。 例如,如果我輸入:1,2,3,4,5,6,7,8,9,10,輸出將是 10,9,8,7,6,0,6,5,4,3 . 程序的順序基本上是這樣的:
調用 ReverseArray:
INVOKE ReverseArray,
LENGTHOF array, SIZEOF array, TYPE array, OFFSET array
ReverseArray 過程(遍歷數組並調用 mSwap32):
ReverseArray PROC,
len:DWORD, s:DWORD, increment:DWORD,address:DWORD
mov edx, OFFSET revArray
call WriteString
mov edi, address
mov esi, address
add esi, s
sub esi, TYPE array
mov ecx, len
shr ecx, 1
L2:
mSwap32 edi, esi
add edi, increment
sub esi, increment
loop L2
ret
ReverseArray endp
mSwap32 宏(給定兩個要交換的地址):
mSwap32 MACRO address1:REQ, address2:REQ
mov edi, address1
mov esi, address2
mov eax, [esi]
push eax
mov eax, [edi]
mov [esi], eax
pop eax
mov [edi], eax
ENDM
我相當確定錯誤出在 mSwap32 中……我確定這是我遺漏的一些小邏輯錯誤,但無論我如何玩弄它,我都無法弄清楚。 ??
這是一個 WORD 數組
有了這一關鍵信息,我們就可以解決問題。 LENGTHOF 為 10(和以前一樣),SIZEOF 現在為 20,TYPE 現在為 2。
ReverseArray PROC,
len:DWORD, s:DWORD, increment:DWORD,address:DWORD
mov edx, OFFSET revArray
call WriteString
mov edi, address
mov esi, address
add esi, s
sub esi, increment ;Better not refer to the actual array here!
mov ecx, len
shr ecx, 1
L2:
mSwap32 edi, esi
add edi, increment
sub esi, increment
loop L2
ret
ReverseArray endp
和宏:
mSwap32 MACRO address1:REQ, address2:REQ
mov edi, address1
mov esi, address2
mov ax, [esi]
push eax
mov ax, [edi]
mov [esi], ax
pop eax
mov [edi], ax
ENDM
更短且仍在使用宏:
mSwap32 MACRO address1:REQ, address2:REQ
mov edi, address1
mov esi, address2
mov ax, [esi]
xchg ax, [edi]
mov [esi], ax
ENDM
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.