Программа сборки для вычисления суммы массива из 10 32-битных целых чисел с использованием цикла (ов) - PullRequest
0 голосов
/ 28 октября 2018

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

Вычислить сумму массива из 10 32-битных целых чисел, используя цикл (ы).Вы можете жестко закодировать входные целые числа.Сохраните сумму в регистре EAX.

INCLUDE Irvine32.inc    
.data
  arrayVal DWORD 1,2,3,4,5,6,7,8,9,10
  counter = 0
.code
main:    
  xor eax, eax                     
  xor edx, edx                     
  mov ecx, LENGTHOF arrayVal       
L1:
  mov ebx, DWORD arrayVal [edx]    
  add eax, ebx                     
  inc edx                          
loop L1                            

  Call WriteDec                    
  exit
end main

1 Ответ

0 голосов
/ 28 октября 2018

Я не делал сборку с колледжа, но постараюсь объяснить, насколько я помню, это может быть немного не так.

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.

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

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