Выбор элементов из одномерного массива - Assembler

Узнай цену своей работы

Формулировка задачи:

Все просто, Есть массив P сост из 10 элементов, найти его первый и последний элемент, удовл. условию: P[1]<P[i]<P[10] Мой быдлокод, реализующий просто запись элементов, запись только первого и последнего по условию ещё не знаю как реализовать, но и этот не работает но почеМУ? Запись вида:
mov esi, [18]
так же хотелось бы более динамическую, как mov esi, [2*что-тотам]
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

Объяснение кода листинга программы

Код выполняет следующие действия:

  1. Инициализирует регистры ESI и EDI, которые используются для индексации массива.
  2. Устанавливает счетчик ECX, который используется для цикла, на len/2-2.
  3. Начинается цикл, который продолжается до тех пор, пока не будут выполнены два условия: AX должен быть равен значению элемента массива с индексом ESI и AX должен быть меньше значения элемента массива с индексом (len/2-2).
  4. Если EDi не равен нулю, то это означает, что мы находимся во второй половине массива, поэтому мы сохраняем значение AX в [b] и затем увеличиваем EDI на 1.
  5. Если EDi равен нулю, то мы находимся в первой половине массива, поэтому мы сохраняем значение AX в [a].
  6. Мы продолжаем увеличивать ESI на 2 после каждой итерации цикла.
  7. После завершения цикла мы выводим значения [a] и [b] с помощью функции printf.
  8. Мы используем функцию _getch для приостановки выполнения программы до тех пор, пока пользователь не нажмет клавишу.
  9. Код завершается возвратом в точку вызова. [mas] - это одномерный массив, содержащий следующие числа: 4, 6, 9, 43, 23, 78, 12, 9, 8, 30. len - это переменная, которая содержит общую длину массива, включая нулевой символ, которая вычисляется как -mas (т.е. сумма всех элементов массива). [a] и [b] - это две переменные, которые используются для хранения значений, вычисленных во время выполнения цикла. fmt - это строка, которая содержит формат, используемый функцией printf, который говорит ей выводить значения [a] и [b] как десятичные числа. Обратите внимание, что данный код не обрабатывает ошибки или исключения.

Оцени полезность:

11   голосов , оценка 4.273 из 5
Похожие ответы