Online Compiler Nasm

extern io_get_dec extern io_print_dec extern io_print_char section .bss n resd 1 arr resd 500000 max_cnt resd 1 min_cnt resd 1 section .text global main main: call io_get_dec mov [n], eax dec n ; n = n - 1!!! mov edi, arr mov esi, 0 mov dword [max_cnt], 0 mov dword [min_cnt], 0 .read_loop: cmp esi, [n] ;последнее число jne .plus_last_max push ecx call io_get_dec pop ecx mov [edi], eax ;проверка предыдущего числа на экстремум/инфимум .find_min: cmp esi, 0 je .find_max cmp [edi - 4], [edi] jge .find_max cmp esi, 1 je .plus_min cmp [edi - 4], [edi - 8] jge .find_max .plus_min: inc [min_cnt] jmp .next .find_max: cmp esi, 0 je .next cmp [edi], [edi - 4] jge .next cmp esi, 1 je .plus_max cmp [edi - 8], [edi - 4] jge .next .plus_max: inc [max_cnt] jmp .next .next: add edi, 4 inc esi jmp .read_loop .plus_last_max: cmp [edi], [edi - 4] ;сравниваем edi jle print1 inc [max_cnt] .print1: mov eax, [max_cnt] call io_print_dec mov eax, 10 call io_print_char mov edi, arr mov esi, 0 .print_max_start: cmp esi, [n] ;? jne .print_last_min cmp [edi], [edi - 4] jge .next_print_max cmp esi, 1 je print_max cmp [edi - 8], [edi - 4] jge .next_print_max .print_max: mov eax, esi call io_print_dec mov eax, 32 call io_print_char jmp .next_print_max .next_print_max: add edi, 4 inc esi jmp .print_max .print_last_max: cmp [edi], [edi - 4] ;сравниваем edi jle plus_last_min mov eax, [edi] call io_print_dec .plus_last_min: mov eax, 10 call io_print_dec cmp [edi], [edi - 4] ;сравниваем edi jge print2 inc [min_cnt] .print2: mov eax, [min_cnt] call io_print_dec mov eax, 10 call io_print_char mov edi, arr mov esi, 0 .print_min_start: cmp esi, [n - 1] ;? jne .end cmp [edi - 4], [edi] jge .next_print_min cmp esi, 1 je print_min cmp [edi - 4], [edi - 8] jge .next_print_min .print_min: mov eax, esi call io_print_dec mov eax, 32 call io_print_char jmp .next_print_min .next_print_min: add edi, 4 inc esi jmp .print_min .print_last_min: cmp [edi], [edi - 4] ;сравниваем edi jge .end mov eax, [edi] call io_print_dec .end: xor eax, eax ret
1) Этот код считывает массив чисел, находит количество локальных минимумов и максимумов, а затем выводит их индексы. Однако в нём есть логические ошибки и опечатки, которые мешают корректной работе.

2) Подсказки:
- Обрати внимание на метки переходов: некоторые из них (например, `print1`, `print_max`, `plus_last_min`) не имеют точки перед именем, что может вызвать ошибку ассемблера. В NASM локальные метки внутри процедур должны начинаться с точки.
- Проверь условие выхода из цикла `.read_loop`: сравнение `cmp esi, [n]` и переход `jne .plus_last_max` могут привести к пропуску обработки последнего элемента или ошибке доступа к памяти.