Сортировка и вывод строки - Assembler
Формулировка задачи:
Здравствуйте уважаемые пользователи CyberForum.ru Возникла небольшая проблема, не как не могу решить задачу для Assebler masm. Помогите пожалуйста... Желательно с кратким объяснением, что бы понять..
Задача:
Ввести строку символьных данных, задавая буфер равный 12 байт. Переставить символы в строке следующим образом: первый символ на место последнего, второй символ на место предпоследнего, предпоследний на место второго, а последний на место первого. Выдать полученную строку символов в 10 строку экрана, начиная с 30 позиции.Решение задачи: «Сортировка и вывод строки»
textual
Листинг программы
title prim0
DOD Segment
nma label byte
max db 13 ; 12 символов и возврат каретки
len db ?
buf db 12 dup(' '), 0Dh, '$'
DOD ends
STO Segment Stack
DB 128 DUP(?)
STO ends
CSC Segment
PR PROC FAR
ASSUME DS:DOD,CS:CSC,SS:STO
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DOD
mov ds,ax
;Очистка экрана
mov ax,0600h
mov bh,07
mov cx,0000
mov dx,184fh
int 10h
;Позиция курсора
MOV AH,02 ; Курсор
MOV BH,00
MOV DH,13 ;Строка
MOV DL,37 ;Столбец
INT 10H
;Ввод текста
mov ah,0Ah
lea dx,nma
int 21h
mov cx,6 ; 12 символов в строке - 6 пар
lea si,buf ; Указывает на начало строки
lea di,buf+12 ; Указывает сразу за концом строки
m1: dec di
mov al,[si] ; Взяли символ из левой части строки
xchg al,[di] ; Поменяли символы
mov [si],al ; Взяли символ из правой половины строки
inc si
loop m1
;Позиция курсора
mov ah,02
mov bh,00
mov dh,10 -1
mov dl,30 -1
int 10h
;Вывод
mov ah,09h
lea dx,buf
int 21h
ret
pr endp
csc ends
end pr
Объяснение кода листинга программы
Код на языке Assembler содержит следующие элементы:
- Описание сегментов:
- DOD: сегмент данных, используется для хранения строк и других данных
- STO: сегмент стека, используется для временного хранения значений
- CSC: сегмент кода, содержит процедуры и основные команды
- Процедура PR:
- В первой части процедуры происходит очистка экрана и установка позиции курсора
- Затем выполняется ввод текста с помощью функции BIOS
- Далее следует сортировка строки с использованием алгоритма пузырька
- В конце процедуры выполняется вывод отсортированной строки
- Названия и значения переменных:
- nma: метка, указывает на начало строки, которую необходимо отсортировать
- max: переменная, содержит максимальное количество символов в строке (13)
- len: переменная, содержит фактическое количество символов в строке
- buf: буфер, используется для временного хранения строки и её сортировки
- Команды:
- PUSH: сохраняет значение регистра на вершине стека
- SUB: выполняет вычитание двух регистров
- MOV: перемещает значение из одного регистра в другой
- ASSUME: задает сегменты, используемые в процедуре
- POS: устанавливает позицию курсора на экране
- INPUT: выполняет ввод символов с клавиатуры
- XCHG: меняет значения двух регистров
- LOOP: выполняет повторяющийся блок команд
- RET: возвращает управление в вызывающую процедуру
- ENDP: заканчивает описание процедуры
- END: заканчивает код программы