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

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

  1. Объявляется начало блока данных .model small
  2. Задаются данные переменной var: var db 'one two three four five' и её длина len = $ - var
  3. Определяется стек: .stack 100h
  4. Начало кода start:
  5. Устанавливаются указатели на сегмент данных: mov ax,@data, mov ds,ax, mov es,ax
  6. Указатели si и di устанавливаются в начало строки и в конец строки, соответственно
  7. Итерация через каждый символ в строке a. Проверка, равен ли текущий байт пробелу: cmp al, ' ', jnz firword b. Если найден пробел, сохраняется указатель на текущее слово и размер этого слова в стеке: push si, push cx, push si, push bx c. Сдвиг каждого символа на 1 позицию влево, начиная со следующего после пробела символа, и повторение этого для каждого слова (цикл firword - init1 - shift - nospace) d. Устанавливается пробел после каждого слова e. Повторение этого процесса до тех пор, пока не будут переставлены все слова
  8. Уставновка флага направления std
  9. Перестановка слов в обратном порядке a. Находится конец строки и сохраняется его указатель в стеке: push di, push cx, push di, push bx b. Копирование каждого символа, начиная с конца строки, влево на одну позицию (цикл label1 - shift2) c. Отражение слов в обратном порядке
  10. Вывод сообщения и завершение программы

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

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