Чтение массива BYTE в массив DWORD

Я пытаюсь завершить домашнее задание, которое включает в себя создание массива BYTE из 2, 4, 6, 8, 10 в сборке, замену этих значений на массив типа 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

person Blair McKinney    schedule 08.10.2013    source источник
comment
Почему si вместо esi?   -  person us2012    schedule 08.10.2013
comment
Сначала я пытался использовать ebx, и компилятор выдавал мне ошибку об индексных массивах?   -  person Blair McKinney    schedule 08.10.2013


Ответы (1)


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
person Gunner    schedule 08.10.2013
comment
Замечательно, в задании было сказано делать что-то определенным образом. Однако ваш ответ помог мне заставить его работать, большое спасибо. - person Blair McKinney; 09.10.2013