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

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

  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
Похожие ответы