Переставить слова, поменяв местами первое слово с последним, второе с предпоследним - 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.