Максимальное значение в массиве
Есть задание. Необходимо найти значение максимального элемента в массиве. Элементы массива должны иметь тип WORD (2 байта). В первом элементе массива должно хранить количество элементов массива −1. То есть оттуда мы должны считать количество чисел, перейти на адрес второй ячейки массива, и начиная с числа по этому адресу уже сравнивать.
Написал следующий код:
section .text
global _start
_start:
mov eax, 3 ; mov eax, [x]
mov ebx,0 ; EBX будет хранить максимальное значение
mov ecx, x ; ECX будет указывать на текущий элемент для выполнения операции сравнения
add ecx, 2
top: cmp ebx, [ecx]
JNS l1
mov ebx, [ecx]
l1: add ecx, 2 ; перемещаем указатель на следующий элемент
dec eax ; выполняем декремент счётчика
jnz top ; если счётчиком не является 0, то тогда выполняем цикл ещё раз
done:
add ebx, '0'
mov [max], ebx ; готово, сохраняем результат в переменной sum
display:
mov edx, 2 ; длина сообщения
mov ecx, max ; сообщение для написания
mov ebx, 1 ; файловый дескриптор (stdout)
mov eax, 4 ; номер системного вызова (sys_write)
int 0x80 ; вызов ядра
mov eax, 1 ; номер системного вызова (sys_exit)
int 0x80 ; вызов ядра
section .data
global x
x:
dw 3
dw 2
dw 4
dw 3
max:
dw 0
Компилирую в Linux через консоль, компиляция проходит, но результат выводит неправильный. Кроме того, ему не нравится синтаксис(segmentation fault)
mov eax, [x]
Если кто разбирается в ассемблере, помогите, пожалуйста. Где я ошибся?
Ответы (1 шт):
Ошибка у вас вот здесь:
top: cmp ebx, [ecx] ← ошибка JNS l1 mov ebx, [ecx] ← ошибка
Вы помещаете в ebx двойное слово — 4 байта, начиная с адреса [ecx], а нужно поместить всего 2 байта:
top:
cmp WORD bx, [ecx]
jns l1
mov WORD bx, [ecx]
Ну и везде далее по коду нужно разобраться с размерностью регистров.