Выполнить циклический сдвиг массива на К чисел влево - 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)