Неожиданный вывод с косвенной адресацией в массивах - PullRequest
0 голосов
/ 29 сентября 2019

В моей проблеме я пытаюсь создать цикл, который будет перебирать массив и использовать процедуру WriteInt / WriteHex для печати элементов массива с помощью MASM.

В приведенном ниже коде у меня естьЦикл настроен аналогично тому, как учебник Ирвина решает похожую проблему:

INCLUDE Irvine32.inc

.data
Array1 BYTE 9,8,7,6

.code
main proc
    mov edi, OFFSET Array1
    mov ecx, LENGTHOF Array1
    mov eax, 0
    L1:
        mov eax,[edi]
        Call WriteInt
        add edi, TYPE Array1
        loop L1
    exit

    invoke ExitProcess,0
main endp
end main

Я ожидаю, что эта программа напечатает 9, 8, 7, 6 соответственно, но по какой-то причине после запуска

mov eax,[edi]

Тогда значение, хранящееся в eax, равно 06070809, который является заданным массивом, но мой ожидаемый результат будет просто сохранен 00000009, а затем, когда "add edi, TYPE Array1" разрешен, 00000008 сохраняется на следующей итерации.

Чтобы разбить его на уровень памяти, скажем, первый элемент массива (09) хранится в 00406000, поэтому при вызове mov eax, [edi] он должен поместить любое значение, хранящееся в 00406000, в eaxрегистр, который равен 9, но вместо этого он помещает весь массив в регистр.

Может кто-нибудь объяснить, почему это так? Скорее всего, я обдумываю проблему, но чувствую, что это может быть связано с отсутствием понимания того, как работают некоторые регистры.

Спасибо!

1 Ответ

0 голосов
/ 03 октября 2019

Просто отредактируйте mov eax,[edi] в mov eax, dword [edi]

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