#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:
Как добавить элементы массива
- Установите указатель на список чисел
- Очистите какой-нибудь контейнер, чтобы получить сумму
- Загрузите счетчик с количеством элементов в списке
- Загрузите число, на которое указывает указатель
- Добавьте значение в контейнер
- Переместите указатель
- Повторите шаги 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]
Не стесняйтесь публиковать свои следующие усилия, если они все еще не работают так, как должны… Приложите реальные усилия, хотя это должно быть определенно больше, чем то, что я написал сегодня. И пишите комментарии, чтобы мы могли увидеть, поняли ли вы, что написали. Удачи.