Циклически сдвинуть массив на k позиций вправо - Assembler

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

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

Подскажите как доделать процедуру
mov bx,cx       ;длина строки
    mov [si+bx],byte ptr '$';в конце строки добавить символ конца строки
    mov ah,0ah      ;функция ввода строки с клавиатуры
    mov dx,offset buf1       ;буфер куда вводить
    int 21h         ;пользователь вводит в текстовом виде в buf значение числа
    push si
    lea si,buf1[2]      ;начало введенного текста
    call str2dw     ;преобразовываем строку в значение
    pop si          ;сохранить начало строки
    mov dx,ax       ;кол-во сдвигаемых позиций
    mov bx,cx       ;длина строки
    mov [si+bx],byte ptr '$';в конце строки добавить символ конца строки
    
    dec cx          ;кол-во сдвигаемых символов
    jcxz r4         ;если сдвигать 0, то пропустить
_loop:
 push cx
 mov di,[si+bx]
 add si,cx
 dec si
 ;mov cx,10
 ci:
 mov al,[si]
 mov [di],al
 dec si
 dec di
 loop ci
 mov di,[si+bx]
 mov al,[di]
 mov [si],al
 pop cx
 loop _loop
r4: ret
Выдаёт то же самое что ввёл, да и неуверен в правильности алгоритма 3 день парюсь помогите кто может!!!

Решение задачи: «Циклически сдвинуть массив на k позиций вправо»

textual
Листинг программы
    
 lea di,msg
mov cx,-1
    mov al,'$'
    repne scasb
    not cx
 ; mov [lenstr],cx
mov cx, 5 ;кол-во позиций для сдвига
ololo:
   push cx
   mov bl, msg[9]   ;последний сомвол строки
   mov si, offset msg
   mov di, offset msg+1
   mov cx, 10-1   ;длинна строки-1
   rep movsb
   mov msg[0], bl
   pop cx
   loop ololo

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

  1. lea di,msg — инициализация регистра di (смещение в памяти) значением msg (строка, с которой будут производиться операции).
  2. mov cx,-1 — инициализация регистра cx (счётчик) отрицательным значением 1.
  3. mov al,'$' — инициализация регистра al (буфер) символом '$' (конец строки).
  4. repne scasb — цикл, который будет выполнять сдвиг строки до тех пор, пока не встретит символ '$'.
  5. not cx — инвертирование значения регистра cx (для корректного выполнения цикла).
  6. mov [lenstr],cx — сохранение длины исходной строки в переменную lenstr (вероятно, для дальнейшего использования).
  7. mov cx, 5 — инициализация счётчика циклов (количество позиций для сдвига).
  8. ololo: — начало блока кода, выполняющегося n раз (где n — значение счётчика cx).
  9. push cx — сохранение текущего значения счётчика cx для корректного выхода из цикла.
  10. mov bl, msg[9] — сохранение последнего символа строки msg в регистр bl (вероятно, для корректного завершения строки после сдвига).
  11. mov si, offset msg — инициализация регистра si (смещение в памяти) значением msg (начало строки).
  12. mov di, offset msg+1 — инициализация регистра di (смещение в памяти) значением msg+1 (смещение в памяти следующего символа строки).
  13. mov cx, 10-1 — инициализация счётчика циклов (длина строки минус 1).
  14. rep movsb — цикл, который будет копировать символы из строки msg в строку msg с учётом сдвига (начиная со второго символа и до последнего — счётчик cx ограничивает количество операций).
  15. mov msg[0], bl — сохранение последнего символа строки (из регистра bl) в начало строки msg (вероятно, для корректного завершения строки после сдвига).
  16. pop cx — восстановление значения счётчика cx из стека.
  17. loop ololo — переход к началу блока кода, выполняющегося n раз (для продолжения сдвига строки). 18-20. Эти три строки повторяются 5 раз (по количеству указанных в переменной cx позиций для сдвига).

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


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

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

8   голосов , оценка 4.25 из 5
Похожие ответы