Переставить слова, поменяв местами первое слово с последним, второе с предпоследним - 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
Объяснение кода листинга программы
- Устанавливается значение переменной
dl
в 0 с помощью инструкцииmov dl, 0
. В данном случае, регистр dl используется как счетчик. - Программа осуществляет переход на метку
n
с помощью инструкции безусловного переходаjmp n
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д