Я вижу некоторые проблемы в вашем коде. Вот первый:
cmp edi, 25
jle loop
mov eax, [esi] <--
sub eax, '0'
mov eax, 4
На данный момент вы проверили всю матрицу и хотите записать наибольшее найденное значение, которое уже есть в esi, поэтому вам не нужно разыменовывать, чтобы получить его. Кроме того, вы должны добавить '0' для чисел от 0 до 9, поэтому преобразование также неверно. И, наконец, после преобразования вы перезаписываете значение в eax, которое поэтому теряется.
Однако здесь происходит настоящая ошибка сегментации,
mov esi, [eax + edi] <--
jmp loop
Сразу после того, как вы напишите результат. Проблема в том, что ecx должен содержать указатель на строку с нулем в конце для записи. Вместо этого вы вводите число, которое хотите написать, что является неопределенным поведением (это означает, что все может произойти). Теперь eax содержит возвращаемое значение записи, поэтому я предполагаю, что произошла ошибка, и теперь eax содержит -1, что приводит к сегментированию. неисправность.
Одним из простых способов решения этой проблемы является добавление выхода jmp после записи значения.
И, наконец, что не менее важно (и, как сказал @ user786653), «неправильная обработка данных размером в байт». Что это значит? По сути, ваша матрица представляет собой массив байтов, но каждый раз, когда вы читаете из памяти, вы выбираете 4 байта за раз. Самое простое решение - объявить вашу матрицу в виде массива двойных слов (dd или dword вместо db) и умножить на 4 смещение (пример: mov eax, [ebx + ecx * 4]).
Да ладно, не волнуйся! Сборка - трудный зверь, с которым можно играть;)
EDIT:
Часть, которая находит наибольшее число, является правильной. Вы просто должны исправить часть «output» и адресацию, о которой я говорил ранее. По моему мнению, если вы используете шестнадцатеричное основание для своих чисел, преобразование его в печатную строку будет намного проще (вы можете умножить на 2 ^ n, сдвинув влево на n мест -> shl eax, 5 = eax * = 32)