Все элементы массива, не равные нулю, переписать, сохраняя их порядок, в начало массива, а нулевые значения - в конец - Assembler
Формулировка задачи:
Создать одномерный массив A[0..N-1]. Все его элементы, не равные нулю, переписать, сохраняя их порядок, в начало массива, а нулевые значения- в конец массива. Новый массив не заводить и сортировку не применять.
Как организовать сия программу?
Решение задачи: «Все элементы массива, не равные нулю, переписать, сохраняя их порядок, в начало массива, а нулевые значения - в конец»
textual
Листинг программы
LOCALS .model small .stack 100h .data CrLf db 0Dh, 0Ah, '$' msgInstance db 'Instance:', 0Dh, 0Ah, '$' msgResult db 'Result:', 0Dh, 0Ah, '$' msgPressAnyKey db 'Press any key to exit...', '$' N dw 10 Array dw 48, -60, 0, 109, 111, 0, 0, 107, -128, 93 .code ;Вывод массива слов (word) ;cx - количество выводимых элементов ;ds:dx - адрес массива слов ShowArray proc push ax push bx push cx push dx push si push di jcxz @@Exit ;если массив пустой - завершить mov si, 1 ;индекс элемента массива mov di, dx ;адрес текущего элемента массива @@ForI: mov ax, [di] call Show_AX mov ah, 02h mov dl, ' ' int 21h ;переход к следующему элементу inc si add di, 2 loop @@ForI @@Exit: pop di pop si pop dx pop cx pop bx pop ax ret ShowArray endp ; выводит знаковое 16-разрядное число из регистра AX на экран ; с выравниванием на 8 позиций по правому краю ; входные данные: ; ax - число для отображения Show_AX proc push ax push bx push cx push dx push si push di mov cx, 10 ;основание системы счисления xor di, di ; di - кол. цифр в числе xor si, si ; si - признак отрицательного числа ; если число в ax отрицательное, то ;1) напечатать (запомнить в стеке) символ '-' ;2) сделать ax положительным or ax, ax jns @@Conv mov si, 1 neg ax @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стек or ax, ax jnz @@Conv ;если число отрицательное - помещаем символ "-" в строку or si, si jz @@Positive mov dx, '-' push dx inc di @@Positive: ; выводим из стека на экран ; - сначала пробелы для выравнивания по правому краю mov cx, 6 sub cx, di mov ah, 02h mov dl, ' ' @@LeftPad: int 21h loop @@LeftPad ;сохранённые символы цифр @@Show: pop dx ; dl = очередной выводимый символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop si pop dx pop cx pop bx pop ax ret Show_AX endp main proc ;инициализация сегментного регистра ds адресом сегмента данных mov ax, @data mov ds, ax ;вывод исходного массива mov ah, 09h lea dx, [msgInstance] int 21h lea dx, [Array] mov cx, [N] call ShowArray mov ah, 09h lea dx, [CrLf] int 21h ;обработка массива mov ax, ds mov es, ax cld @@while: ; - поиск первого нулевого элемента lea di, [Array] mov cx, [N] mov ax, 0 repne scasw jnz @@StopProcess mov bx, di ;Indx0 sub bx, 2 ; - поиск следующего за нулевым элементом ненулевого jcxz @@StopProcess repe scasw je @@StopProcess mov dx, [di-2] mov [bx], dx mov [di-2], ax jmp @@while @@StopProcess: ;вывод результата mov ah, 09h lea dx, [msgResult] int 21h lea dx, [Array] mov cx, [N] call ShowArray mov ah, 09h lea dx, [CrLf] int 21h ;ожидание нажатия любой клавиши mov ah, 09h lea dx, [msgPressAnyKey] int 21h mov ah, 00h int 16h mov ax, 4C00h int 21h main endp end main
Объяснение кода листинга программы
Этот код на языке ассемблера выполняет следующие действия:
- Инициализирует сегментный регистр ds для работы с массивом.
- Выводит исходный массив на экран.
- Обрабатывает массив, перемещая все ненулевые элементы в начало массива, а нулевые - в конец.
- Выводит результат обработки массива на экран.
- Ожидает нажатия любой клавиши для завершения работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д