0

我正在尝试完成一项家庭作业,其中涉及在程序集中创建一个 2、4、6、8、10 的 BYTE 数组,将这些值交换为 DWORD 类型的数组,显示结果,交换值的顺序并再次显示在装配中。除了从 8-> 32 位数组交换之外,我的每件作品都在工作。这是我最近的尝试迭代:

INCLUDE Irvine32.inc
.data
byteArray BYTE 2, 4, 6, 8, 10
intArray DWORD ?

.code
main PROC
    Swap:
        mov si,OFFSET byteArray     ;si=byteArray
        mov ebx,OFFSET intArray     ;ebx=intArray
        mov ecx,LENGTHOF byteArray  ;since byteArray is the one defined ATM

        swaploop:
            mov eax,[si]
            mov [ebx], eax  
            inc esi
            add ebx, 4
            loop swaploop
4

1 回答 1

3

DWORD 是 32 位的吧?BYTE 数组中的数字是 8 位,对吗?因此,您的 intArray 最多可以容纳 4 个数字,但不是您期望的方式。相反,(如果我理解正确的话)是创建一个 DWORD 数组来保存所有 5 个数字:

.data
byteArray   BYTE 2, 4, 6, 8, 10

.data?
intArray    DWORD lengthof byteArray dup (?)

这个:

intArray DWORD ?

看起来它包含你所有的数字,但是当你移动一个以上的字节到intArray地址时,它会踩到后面的内容intArray

    xor     ecx, ecx                ; index into arrays, 0 on start
    mov     esi, offset byteArray   ; address of byteArray
    mov     edi, offset intArray    ; address of intArray

MoveEm:
    movzx   eax, byte ptr [esi + ecx]   ; move byte from (address) byteArray + ecx into eax, zero extending eax
    mov     dword ptr [edi + 4 * ecx], eax  ; move byte in eax, into (address) intArray + 4 * ecx
    inc     ecx
    cmp     ecx, lengthof byteArray
    jne     MoveEm
于 2013-10-08T01:30:12.633 回答