2D массивы и добавление их вместе в сборке

#assembly #masm

#сборка #masm

Вопрос:

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

     INCLUDE Irvine32.inc

.data
array BYTE 11h, 43h, 21h, 65h, 10h
array_size = ($ - array)            ;array_size = 5
      BYTE 72h, 75h, 1Ah, 5Dh, 0FFh
      BYTE 0E4h, 0AFh, 33h, 3Dh, 0F6h
      BYTE 60h, 30h, 0AAh, 5Ah, 6Ah
      BYTE 0DFh, 0CAh, 4Bh, 4Fh, 1Ah

row_result BYTE 5 DUP(?)


.code
main PROC
    MOV EAX, 0
    MOV ECX, array_size
    MOV AL, [array 12]
    CALL DUMPREGS
    exit
main ENDP

row_sum PROC
;finish the code to sum up every row within the array and place them into row_result
row_sum ENDP

array_sum PROC
;finish the code to sum up the whole 2D array and place it into EAX
array_sum ENDP

END main
 

Как мне создать цикл для добавления каждой строки по отдельности, а затем всех строк в целом?

Комментарии:

1. Пожалуйста, укажите конкретную проблему, с которой вы столкнулись.

2. У меня возникли проблемы с созданием цикла, необходимого для добавления каждой строки по отдельности и перемещения ее в неинициализированный массив, затем во все строки в целом и перемещения их в EAX.

3. Можете ли вы написать цикл на C или псевдокоде?

4. Да, в настоящее время я изучаю C , но у меня много проблем с изучением кода сборки x86.

5. Хорошо, как выглядит псевдокод? Затем все, что вам нужно сделать, это разложить псевдокод на отдельные части и закодировать их в сборке. Очень сложно писать алгоритмы с нуля в сборке, когда вы ее изучаете, поэтому начните с C или псевдокода.

Ответ №1:

Как добавить элементы массива

  1. Установите указатель на список чисел
  2. Очистите какой-нибудь контейнер, чтобы получить сумму
  3. Загрузите счетчик с количеством элементов в списке
  4. Загрузите число, на которое указывает указатель
  5. Добавьте значение в контейнер
  6. Переместите указатель
  7. Повторите шаги 4, 5, 6 и 7 для всех элементов в списке

В сборке (masm)

   mov   esi, offset array       ; 1
  xor   edx, edx                ; 2
  mov   ecx, array_size         ; 3
Again:
  movzx eax, byte ptr [esi]     ; 4    (*)
  add   edx, eax                ; 5
  inc   esi                     ; 6
  dec   ecx                     ;  7
  jnz   Again                   ; /
 

Поскольку ваш массив содержит 5 строк, которые на самом деле являются 5 маленькими массивами, вам придется повторить описанное выше 5 раз (используя вложенные циклы), каждый раз сохраняя сумму в следующей доступной позиции в вашем целевом массиве row_result (используя другой указатель, подобный EDI ).

 row_result BYTE 5 DUP(?)
 

Возможно, вы захотите увеличить размер здесь. Я не добавлял эти числа сам, но я думаю, что добавление чисел может быстро привести к переполнению байтового формата.

Как мне создать цикл для добавления каждой строки по отдельности, а затем всех строк в целом?

Здесь вы применяете тот же алгоритм к массиву row_result .

(*) Либо выясните, либо решите сами, следует ли считать числа в массиве знаковыми или беззнаковыми.

  • Если они подписаны, используйте movsx eax, byte ptr [esi]
  • Если они не имеют знака, используйте movzx eax, byte ptr [esi]

Не стесняйтесь публиковать свои следующие усилия, если они все еще не работают так, как должны… Приложите реальные усилия, хотя это должно быть определенно больше, чем то, что я написал сегодня. И пишите комментарии, чтобы мы могли увидеть, поняли ли вы, что написали. Удачи.