Выбор элементов из одномерного массива - Assembler
Формулировка задачи:
Все просто, Есть массив P сост из 10 элементов, найти его первый и последний элемент, удовл. условию:
P[1]<P[i]<P[10]
Мой быдлокод, реализующий просто запись элементов, запись только первого и последнего по условию ещё не знаю как реализовать, но и этот не работает но почеМУ?
Запись вида:
так же хотелось бы более динамическую, как mov esi, [2*что-тотам]
mov esi, [18]
section '.data' data readable writeable mas dw 4, 6, 9, 43, 23, 78, 12, 9, 8, 30, 0 ArrayResult db ? a dw ? b dw ? section '.text' code readable executable Start: xor eax,eax xor edx,edx lea dx, [mas] lea di, [ArrayResult] mov [a], dx mov esi, [18] mov ax, [esi+mas] mov [b], ax point: cmp dx, 0 je Exit cmp dx, [a] jnae point cmp dx, [b] jnbe inco jnae write write: mov di, dx inc di inc dx jmp point inco: inc dx jmp point Exit:
Решение задачи: «Выбор элементов из одномерного массива»
textual
Листинг программы
FORMAT PE CONSOLE 5.0 include 'include\win32a.inc' start: mov esi,2 xor edi,edi mov ecx,len/2-2 @@: mov ax,[mas+esi] cmp ax,[mas] jbe @1 cmp ax,[mas+len/2-2] jae @1 test edi,edi jnz @2 inc edi mov [a],ax jmp @1 @2: mov [b],ax @1: add esi,2 loop @b movzx ecx,[a] movzx ebx,[b] cinvoke printf,fmt,ecx,ebx cinvoke _getch ret mas dw 4, 6, 9, 43, 23, 78, 12, 9, 8, 30 len=$-mas a dw ? b dw ? fmt db 'a=%d, b=%d',0 data import library msvcrt,'msvcrt.dll' import msvcrt,\ printf,'printf',\ _getch,'_getch' end data
Объяснение кода листинга программы
Код выполняет следующие действия:
- Инициализирует регистры ESI и EDI, которые используются для индексации массива.
- Устанавливает счетчик ECX, который используется для цикла, на len/2-2.
- Начинается цикл, который продолжается до тех пор, пока не будут выполнены два условия: AX должен быть равен значению элемента массива с индексом ESI и AX должен быть меньше значения элемента массива с индексом (len/2-2).
- Если EDi не равен нулю, то это означает, что мы находимся во второй половине массива, поэтому мы сохраняем значение AX в [b] и затем увеличиваем EDI на 1.
- Если EDi равен нулю, то мы находимся в первой половине массива, поэтому мы сохраняем значение AX в [a].
- Мы продолжаем увеличивать ESI на 2 после каждой итерации цикла.
- После завершения цикла мы выводим значения [a] и [b] с помощью функции printf.
- Мы используем функцию _getch для приостановки выполнения программы до тех пор, пока пользователь не нажмет клавишу.
- Код завершается возвратом в точку вызова. [mas] - это одномерный массив, содержащий следующие числа: 4, 6, 9, 43, 23, 78, 12, 9, 8, 30. len - это переменная, которая содержит общую длину массива, включая нулевой символ, которая вычисляется как -mas (т.е. сумма всех элементов массива). [a] и [b] - это две переменные, которые используются для хранения значений, вычисленных во время выполнения цикла. fmt - это строка, которая содержит формат, используемый функцией printf, который говорит ей выводить значения [a] и [b] как десятичные числа. Обратите внимание, что данный код не обрабатывает ошибки или исключения.