Переставить первое и последнее слово в строке - Assembler
Формулировка задачи:
Необходимо переставить первое и последнее слово в строке. Как реализовать?
Решение задачи: «Переставить первое и последнее слово в строке»
textual
Листинг программы
- .model small
- .data
- var db 'one two three four five'
- len = $ - var
- .stack 100h
- .code
- start:
- mov ax,@data
- mov ds,ax
- mov es,ax
- lea si,var
- mov di,si
- add di,len-1
- mov cx,len
- firtoend:
- mov al,byte ptr [si]
- cmp al,' '
- jnz firword
- mov bx,1
- push si
- push bx
- jmp init1
- firword:
- push si
- push cx
- init1:
- lea si,var+1
- mov cx,len
- shift:
- mov ah,byte ptr [si]
- mov byte ptr [si-1],ah
- inc si
- loop shift
- pop cx
- cmp cx,len
- jnz nospace
- mov byte ptr [di],' '
- nospace:
- pop si
- mov byte ptr [di+1],al
- loop firtoend
- std
- mov al,' '
- lea di,var
- add di,len-1
- mov cx,len
- repne scasb
- push di
- mov bx,cx
- dec bx
- repne scasb
- push cx
- inc cx
- xor di,di
- label1:
- push di
- push cx
- mov al,byte ptr [di]
- mov di,1
- mov cx,bx
- shift2:
- mov ah,byte ptr [di]
- mov byte ptr [di-1],ah
- inc di
- loop shift2
- mov byte ptr [di-1],al
- pop cx
- pop di
- loop label1
- pop cx
- pop di
- middle:
- mov ah,byte ptr [di-1]
- mov byte ptr [di],ah
- dec di
- loop middle
- mov byte ptr [di],' '
- mov ah,4Ch
- mov al,00h
- int 21h
- end start
Объяснение кода листинга программы
- Объявляется начало блока данных
.model small
- Задаются данные переменной var:
var db 'one two three four five'
и её длинаlen = $ - var
- Определяется стек:
.stack 100h
- Начало кода
start:
- Устанавливаются указатели на сегмент данных:
mov ax,@data
,mov ds,ax
,mov es,ax
- Указатели
si
иdi
устанавливаются в начало строки и в конец строки, соответственно - Итерация через каждый символ в строке
a. Проверка, равен ли текущий байт пробелу:
cmp al, ' '
,jnz firword
b. Если найден пробел, сохраняется указатель на текущее слово и размер этого слова в стеке:push si
,push cx
,push si
,push bx
c. Сдвиг каждого символа на 1 позицию влево, начиная со следующего после пробела символа, и повторение этого для каждого слова (циклfirword
-init1
-shift
-nospace
) d. Устанавливается пробел после каждого слова e. Повторение этого процесса до тех пор, пока не будут переставлены все слова - Уставновка флага направления
std
- Перестановка слов в обратном порядке
a. Находится конец строки и сохраняется его указатель в стеке:
push di
,push cx
,push di
,push bx
b. Копирование каждого символа, начиная с конца строки, влево на одну позицию (циклlabel1
-shift2
) c. Отражение слов в обратном порядке - Вывод сообщения и завершение программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д