Я не делал сборку с колледжа, но постараюсь объяснить, насколько я помню, это может быть немного не так.
INCLUDE Irvine32.inc
эта строка используется для импорта Irvine32.inc, который требуется для32-битное программирование.
.data
Программа сборки состоит из нескольких секций ( сегменты памяти ), секция данных используется для выделения областей памяти и переменных, которые будут использоваться в последующих секциях.
arrayVal DWORD 1,2,3,4,5,6,7,8,9,10
здесь мы создаем массив, 32-битный, обозначенный DWORD и инициализируемый со значениями от 1 до 10. С arrayVal, указывающим на 1.
counter = 0
Мы вернемся к этому чуть позжеу меня есть сомнения по этому поводу: P
.code
main:
Раздел кода и main, две вышеупомянутые строки примерно говорят о том, что мы закончили с объявлением переменных, все следующие заявленные вещи - это инструкции, которые вы должны выполнить в качестве основной функции.
Прежде чем я объясню другой следующий код, вы должны понимать, что даже если вы создали сегменты памяти, содержащие данные, они не могут быть использованыдля операций по сборке.Вы должны использовать специальные местоположения, называемые регистрами для них подробнее здесь .edx, eax и ecx - все регистры, используемые для специальных функций.
xor eax, eax
xor edx, edx
регистр в основном хранит двоичные данные, они могут иметь данные из старых операций, прежде чем мы сбрасываем их на ноль, используя для них значение xor. (Они быстрее, чем их установка на ноль объяснение здесь).
mov ecx, LENGTHOF arrayVal
эта команда в основном перемещает длину arrayval в регистр ecx, который обычно используется в качестве счетчика.
Таким образом, общая логика будет.Считайте одно хранилище значений в ebx, добавьте его в eax (наш накопитель), а затем получите следующее значение массива в ebx и добавьте его в ebx и т. Д., И т. Д., Пока мы не добавим все значения.
L1: and loop L1
цикл это инструкция очень особенная.Это в основном делает две вещи, чтобы перейти туда, где мы упомянули в этом случае L1, и автоматически уменьшить ecx, пока ecx не станет равным нулю.и все между ними повторяется до ecx и, следовательно, эти строки
mov ebx, DWORD arrayVal [edx]
add eax, ebx
inc edx
выполняются для всех значений массива.но возникает вопрос: зачем вам нужен счетчик в первую очередь в разделе данных (может быть, это зарезервированное слово для ecx, я не уверен).
Call WriteDec
exit
теперь после добавления всех значений, если вы вызываетеWriteDec выводит значения из регистра eax на стандартный вывод, и все готово.поэтому мы выходим и заканчиваем main.
Есть некоторые вещи, которые кажутся выключенными и ненужными, но если вы немного погуглите, вы должны понять больше. Этот кажется хорошим началом.Может быть, прочитал пару книг, так как вы, кажется, очень новичок.