Используйте цикл, чтобы поменять местами элементы n-й позиции из массива1 и массива2

В настоящее время я прохожу курс сборки, и у меня есть вопрос домашнего задания, который я хочу убедиться, что он правильный. Мой вопрос гласит:

Дайте массив с именем array1 со значениями 1000h, 2000h, 3000h, 4000h, 5000h и другой массив с именем array2 со значениями 11111h, 22222h, 33333h, 44444h, 55555h. Используйте цикл, чтобы поменять местами элементы n-й позиции из массива1 и массива2.

Я написал этот код:

; AddTwo.asm - adds two 32-bit integers.
; Chapter 3 example

.386
.model flat,stdcall
.stack 4096
INCLUDE Irvine32.inc ; including the library onto the program
ExitProcess proto,dwExitCode:dword

.data
    array1 WORD 1000h, 2000h, 3000h, 4000h, 5000h
    array2 DWORD 11111h, 22222h, 33333h, 44444h, 55555h

.code
main proc
    mov ecx, 5
    mov esi, offset Array1 ; esi points to beginning of Array1
    mov edi, offset Array2
L1:
    xchg edi, esi ; swaps values of array1 (esi) and array2 (edi)

    add esi, 4 ; increments the address to next element
    add edi, 4
    loop L1 ; will loop through label 1 amount of times ecx is




    call DumpRegs ; main utility call to display all registers and status flags
    invoke ExitProcess,0
main endp
end main

Мой код компилируется, но я не уверен на 100%, правильно ли это. Любая помощь будет оценена.


person Cenzo    schedule 04.04.2020    source источник
comment
Используйте отладчик для просмотра содержимого памяти.   -  person Peter Cordes    schedule 05.04.2020


Ответы (1)


array1 WORD 1000h, 2000h, 3000h, 4000h, 5000h
array2 DWORD 11111h, 22222h, 33333h, 44444h, 55555h

Если вам нужен шанс на успешный обмен, вам нужно определить оба массива одинакового размера. Как вы можете хранить DWORD в месте размера WORD?

Не выбирайте формат данных на основе полученных вами примеров, а основывайте свой выбор на том, чего должна достичь ваша программа.

xchg edi, esi ; swaps values of array1 (esi) and array2 (edi)

Это только меняет местами указатели, а не данные, на которые они ссылаются!

Следующий код меняет местами 2 элемента размера DWORD:

mov eax, [esi]
mov edx, [edi]
mov [esi], edx
mov [edi], eax

В качестве оптимизации вы должны заменить инструкцию loop L1 на

dec ecx
jnz L1

Это быстрее!

person Sep Roland    schedule 04.04.2020
comment
Спасибо за вашу помощь, очень ценю это. Это имеет гораздо больше смысла! - person Cenzo; 05.04.2020