Выполнить циклический сдвиг массива на К чисел влево - Assembler

Узнай цену своей работы

Формулировка задачи:

Добрый день. Такое во дело, дали условие : выполнить циклический сдвиг массива на к чисел влево (к- задано). Думаю как что реализовать.

Решение задачи: «Выполнить циклический сдвиг массива на К чисел влево»

textual
Листинг программы
  1. ; Выполнить циклический сдвиг массива на k-чисел влево
  2. ;fasm code....
  3. org  100h
  4. jmp  start
  5.  
  6. mess0   db   13,10,' String: $'
  7. mess1   db   13,10,'  Shift: $'
  8. mess2   db   13,10,' Result: $'
  9. buff    db   80 dup('$')     ; буфер для ввода
  10. len dw   0           ; длина строки
  11.  
  12. start:  mov   dx,mess0       ;
  13.     call  message        ;
  14.     xor   cx,cx      ; обнуляем длину
  15.     mov   di,buff        ; адрес приёмника
  16.     mov   ah,1       ; ввод с эхом
  17. input:  int   21h        ;
  18.     cmp   al,13      ; Enter - закончить ввод
  19.     je    begin      ;
  20.     stosb            ; сохраняем символ в буфере
  21.     inc   cx         ; считаем длину строки
  22.     jmp   input      ;
  23.  
  24. begin:  mov   [len],cx       ; запомним её..
  25.     mov   dx,mess1       ;
  26.     call  message        ;
  27.     mov   ah,1       ; вводим(k) - значение сдвига
  28.     int   21h        ; (здесь можешь добавить фильтр чисел)
  29.     and   ax,0fh         ;
  30.     push  ax         ; запомним..
  31.  
  32.     mov   dx,mess2       ;
  33.     call  message        ;
  34.     pop   bx         ; ВХ = кол-во сдвигов (счётчик цикла)
  35. worm:   mov   si,buff        ; источник,
  36.     mov   di,si      ;    ..он-же приёмник
  37.     lodsb            ; берём первый элемент
  38.     push  ax         ; запоминаем его в стеке
  39.     mov   cx,[len]       ; длина строки для MOVSB
  40.     dec   cx         ;    ..без первого элемента
  41.     rep   movsb      ; смещаем всю строку влево!
  42.     pop   ax         ; снимаем первый элемент
  43.     stosb            ; записываем его последним символом
  44.     dec   bx         ; уменьшаем кол-во сдвигов
  45.     jnz   worm       ; ВХ нуль? Нет - на повтор..
  46.  
  47.     mov   dx,buff        ; выводим сдвинутую строку на экран!
  48.     call  message        ;
  49.  
  50. exit:   xor   ax,ax      ; ждём любую клавишу..
  51.     int   16h        ;
  52.     int   20h        ; выход!
  53. ;---------------------------------------------------------------------
  54. message:             ; вывод строки средствами DOS
  55.     mov   ah,9       ;
  56.     int   21h        ;
  57.     ret          ;

Объяснение кода листинга программы

  1. Создаем переменные:
    • len - длина строки (10 байт)
    • buff - буфер для ввода (80 байт)
    • cx - счётчик цикла
    • bx - счётчик кол-ва сдвигов
    • ax - используется в качестве временной переменной
    • si - источник (буфер)
    • di - приёмник (буфер)
    • mess0, mess1, mess2 - строки для вывода на экран
  2. Цикл с условием:
    • Пока значение bx больше нуля, выполняем следующие действия:
      • Смещаем всю строку влево на один символ (rep movsb)
      • Записываем последний символ в буфер (stosb)
      • Уменьшаем значение bx на единицу (dec bx)
  3. Вывод на экран:
    • Выводим сдвинутую строку на экран (mov dx, buff; call message)
  4. Ввод числа:
    • Вводим значение k (вводим(k) - значение сдвига)
    • Фильтрация чисел не предусмотрена
  5. Организация ввода:
    • Пока не введён символ Enter, выполняем следующие действия:
      • Сохраняем символ в буфере (stosb)
      • Увеличиваем значение cx на единицу (inc cx)
  6. Вывод сообщений:
    • Выводим сообщения на экран (mov dx,mess0; call message)
    • Выводим значение k (mov dx,mess1; call message)
    • Выводим результат (mov dx,mess2; call message)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы