Организация процедур: первый отрицательный обменять местами с последним четным элементом массива - Assembler
Формулировка задачи:
Необходимо: Первый отрицательный обменять местами с последним четным элементом массива. (Примеры прикреплены)
Решение задачи: «Организация процедур: первый отрицательный обменять местами с последним четным элементом массива»
textual
Листинг программы 1
.model flat .data x dd 1,2,3,45,7,-7,5,9,7,1,11 n equ $-x .code public main main proc call ff xor ax, ax ret main endp ff proc mov ebx, - type x f1: add ebx, type x cmp ebx, n jae quit ; не нашли отрицательного элемента cmp x[ebx], 0 jl next ; нашли первый отрицательный jmp f1 next: mov esi, n f2: sub esi, type x cmp esi, 0 jl quit ; не нашли четного mov eax, x[esi] shr eax, 1 jnc final ; нашли четный jmp f2 final: rcl eax, 1 xchg eax, x[ebx] mov x[esi], eax quit: ret ff endp end
Объяснение кода листинга программы 1
В коде представлен алгоритм, который выполняет следующие действия:
- Организация процедур: Первый отрицательный обменять местами с последним четным элементом массива.
- .model flat: Указывает компилятору, что следует использовать плоский модель памяти.
- .data: Описывает данные, которые будут использоваться в программе. В данном случае это переменная
x, которая содержит список чисел. - x dd 1,2,3,45,7,-7,5,9,7,1,11: Определяет переменную
xкак двойной слова (dd), содержащие указанные числа. - n equ $-x: Определяет переменную
nкак смещение от начала массиваxдо его последнего элемента. - .code: Описывает кодовые сегменты, которые будут использоваться в программе.
- public main: Делает процедуру
mainдоступной из других сегментов. - main proc: Определяет сегмент кода для процедуры
main. - call ff: Вызывает процедуру
ffиз сегмента кодаmain. - xor ax, ax: Очищает регистр
ax. - ret: Завершает выполнение процедуры
main. - ff proc: Определяет сегмент кода для процедуры
ff. - mov ebx, - type x: Перемещает в регистр
ebxсмещение до первого отрицательного элемента в массивеx. - f1: add ebx, type x: Увеличивает смещение в регистре
ebxна размер типаx. - cmp ebx, n: Сравнивает смещение в регистре
ebxс размером массиваx. Если меньше, то продолжается поиск отрицательного элемента. - cmp x[ebx], 0: Сравнивает значение элемента массива
xс нулем. Если меньше, то найден первый отрицательный элемент. - jl next: Если текущий элемент массива меньше нуля, то переходим к поиску следующего отрицательного элемента.
- mov esi, n: Перемещает в регистр
esiсмещение до последнего четного элемента в массивеx. - f2: sub esi, type x: Уменьшает смещение в регистре
esiна размер типаx. - cmp esi, 0: Сравнивает смещение в регистре
esiс нулем. Если меньше, то не найден четный элемент. - mov eax, x[esi]: Перемещает в регистр
eaxзначение элемента массиваx, смещение которого в регистреesi. - shr eax, 1: Сдвигает значение в регистре
eaxвправо на один бит. Если результат отрицательный, то элемент четный. - jnc final: Если значение в регистре
eaxне изменилось при сдвиге вправо, то найден четный элемент. - jmp f2: Переходит к началу цикла поиска четного элемента.
- final:: Если найден четный элемент, то выполняется обмен с первым отрицательным элементом.
- rcl eax, 1: Сдвигает значение в регистре
eaxвлево на один бит. - xchg eax, x[ebx]: Обменивает значение в регистре
eaxс элементом массиваx, смещение которого в регистреebx. - mov x[esi], eax: Записывает обмененное значение в элемент массива
x, смещение которого в регистреesi. - quit:: Код, который будет выполнен при завершении работы программы.
- ret: Завершает выполнение процедуры
ff. - end: Конец описания сегмента кода для процедуры
ff. - end: Конец программы.
textual
Листинг программы 2
cmp x[ebx], 0 jl next ; нашли первый отрицательный jmp f1 next:
Объяснение кода листинга программы 2
x- это массив, в котором происходит обмен элементовebx- это регистр, который используется как индекс для обращения к элементам массива0- это значение, с которым сравнивается каждый элемент массива- Если элемент массива меньше нуля (отрицательный), то переходим к процедуре обмена
- Если элемент массива больше или равен нулю (не отрицательный), то переходим к следующему элементу без обмена
f1- это метка, на которую происходит переход в случае нахождения первого отрицательного элемента