将BYTE数组读入DWORD数组

时间:2013-10-08 01:05:17

标签: assembly masm irvine32

我正在尝试完成一项功课,包括在程序集中创建一个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

1 个答案:

答案 0 :(得分: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