Переставить слова, поменяв местами первое слово с последним, второе с предпоследним - Assembler

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

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

Прошу помощи с задачей. Эмулятор i8086 Задана строка из буквенных символов, разделенных на слова одним или несколькими пробелами. Удалить лишние пробелы в строке и переставить слова, поменяв местами первое слово с последним, второе с предпоследним и т.д.
Вот код. Он вроде бы рабочий, но упростить бы хотелось
data segment
    in_str db 80,?,82 dup (?)       
    out_str db  80 dup (?)
    enter db 0dh, 0ah, '$'          
data ends
code segment
assume cs: code, ds: data
        start: mov ax, data           
           mov ds, ax          
               mov ah, 0ah
               int 21h
               lea bx, in_str+2  
           xor cx, cx
           mov cl, in_str+1
               dec cx
           add bx, cx          ; чтение с конца строки
               xor ax, ax
               inc cx
               
          beg: mov dh, cl          ; запомним cl через dh
               mov al, [bx]
               
               cmp al, ' '         ; сравнение al с пробелом
               jne m               ; если не равно то на m
           
            s: mov cl, dl          ; присвоить счетчик dl в cl
         beg1: pop ax
               
               mov out_str[si], al
               inc si
               loop beg1

               mov out_str[si], ' ' ; прибавление пробела после перестановки
               inc si
           
               mov dl, 0           ; обнуление счетчика
               cmp dl, 0
               je n
            
            m: inc dl              ; счетчик числа элементов до пробела
               push ax
               cmp dh, 1           ; если конец строки то на s
               je s

            n: 
               dec bx
               mov cl, dh          ; то что  запомнили в dh обратно в cl
               loop beg
               
               xor dx, dx
               
               lea dx, enter
               mov ah, 09h
               int 21h
     
               lea dx, out_str
               mov ah, 09h
               int 21h
               mov ah, 0ah
               int 21h
         quit: mov ax, 4c00h
               int 21h
code ends
end start

Решение задачи: «Переставить слова, поменяв местами первое слово с последним, второе с предпоследним»

textual
Листинг программы
               mov dl, 0           ; обнуление счетчика
               jmp n

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

  1. Устанавливается значение переменной dl в 0 с помощью инструкции mov dl, 0. В данном случае, регистр dl используется как счетчик.
  2. Программа осуществляет переход на метку n с помощью инструкции безусловного перехода jmp n.

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

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