簡體   English   中英

如何反轉數組是匯編?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM