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