В моей проблеме я пытаюсь создать цикл, который будет перебирать массив и использовать процедуру 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, но вместо этого он помещает весь массив в регистр.
Может кто-нибудь объяснить, почему это так? Скорее всего, я обдумываю проблему, но чувствую, что это может быть связано с отсутствием понимания того, как работают некоторые регистры.
Спасибо!