Используйте al oop, чтобы поменять n-е элементы позиции из array1 и array2 - PullRequest
1 голос
/ 04 апреля 2020

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

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

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

; 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% если это правильно. Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 04 апреля 2020
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

Это быстрее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...