Выполнить циклический сдвиг массива на К чисел влево - 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)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д