Выполнить циклический сдвиг массива на К чисел влево - Assembler
Формулировка задачи:
Добрый день. Такое во дело, дали условие : выполнить циклический сдвиг массива на к чисел влево (к- задано). Думаю как что реализовать.
Решение задачи: «Выполнить циклический сдвиг массива на К чисел влево»
textual
Листинг программы
- ; Выполнить циклический сдвиг массива на k-чисел влево
- ;fasm code....
- org 100h
- jmp start
- mess0 db 13,10,' String: $'
- mess1 db 13,10,' Shift: $'
- mess2 db 13,10,' Result: $'
- buff db 80 dup('$') ; буфер для ввода
- len dw 0 ; длина строки
- start: mov dx,mess0 ;
- call message ;
- xor cx,cx ; обнуляем длину
- mov di,buff ; адрес приёмника
- mov ah,1 ; ввод с эхом
- input: int 21h ;
- cmp al,13 ; Enter - закончить ввод
- je begin ;
- stosb ; сохраняем символ в буфере
- inc cx ; считаем длину строки
- jmp input ;
- begin: mov [len],cx ; запомним её..
- mov dx,mess1 ;
- call message ;
- mov ah,1 ; вводим(k) - значение сдвига
- int 21h ; (здесь можешь добавить фильтр чисел)
- and ax,0fh ;
- push ax ; запомним..
- mov dx,mess2 ;
- call message ;
- pop bx ; ВХ = кол-во сдвигов (счётчик цикла)
- worm: mov si,buff ; источник,
- mov di,si ; ..он-же приёмник
- lodsb ; берём первый элемент
- push ax ; запоминаем его в стеке
- mov cx,[len] ; длина строки для MOVSB
- dec cx ; ..без первого элемента
- rep movsb ; смещаем всю строку влево!
- pop ax ; снимаем первый элемент
- stosb ; записываем его последним символом
- dec bx ; уменьшаем кол-во сдвигов
- jnz worm ; ВХ нуль? Нет - на повтор..
- mov dx,buff ; выводим сдвинутую строку на экран!
- call message ;
- exit: xor ax,ax ; ждём любую клавишу..
- int 16h ;
- int 20h ; выход!
- ;---------------------------------------------------------------------
- message: ; вывод строки средствами DOS
- mov ah,9 ;
- int 21h ;
- ret ;
Объяснение кода листинга программы
- Создаем переменные:
- len - длина строки (10 байт)
- buff - буфер для ввода (80 байт)
- cx - счётчик цикла
- bx - счётчик кол-ва сдвигов
- ax - используется в качестве временной переменной
- si - источник (буфер)
- di - приёмник (буфер)
- mess0, mess1, mess2 - строки для вывода на экран
- Цикл с условием:
- Пока значение bx больше нуля, выполняем следующие действия:
- Смещаем всю строку влево на один символ (rep movsb)
- Записываем последний символ в буфер (stosb)
- Уменьшаем значение bx на единицу (dec bx)
- Пока значение bx больше нуля, выполняем следующие действия:
- Вывод на экран:
- Выводим сдвинутую строку на экран (mov dx, buff; call message)
- Ввод числа:
- Вводим значение k (вводим(k) - значение сдвига)
- Фильтрация чисел не предусмотрена
- Организация ввода:
- Пока не введён символ Enter, выполняем следующие действия:
- Сохраняем символ в буфере (stosb)
- Увеличиваем значение cx на единицу (inc cx)
- Пока не введён символ Enter, выполняем следующие действия:
- Вывод сообщений:
- Выводим сообщения на экран (mov dx,mess0; call message)
- Выводим значение k (mov dx,mess1; call message)
- Выводим результат (mov dx,mess2; call message)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д