Переставить первое и последнее слово в строке - 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 firwordb. Если найден пробел, сохраняется указатель на текущее слово и размер этого слова в стеке:push si,push cx,push si,push bxc. Сдвиг каждого символа на 1 позицию влево, начиная со следующего после пробела символа, и повторение этого для каждого слова (циклfirword-init1-shift-nospace) d. Устанавливается пробел после каждого слова e. Повторение этого процесса до тех пор, пока не будут переставлены все слова - Уставновка флага направления
std - Перестановка слов в обратном порядке
a. Находится конец строки и сохраняется его указатель в стеке:
push di,push cx,push di,push bxb. Копирование каждого символа, начиная с конца строки, влево на одну позицию (циклlabel1-shift2) c. Отражение слов в обратном порядке - Вывод сообщения и завершение программы