Отсортировать строку по возрастанию - Assembler
Формулировка задачи:
Помогите написать, в формате .com и отладить в debug'е (dosbox).
Ввести строку символьных данных, задавая буфер равный 25 байт. Вводить только английские символы. Отсортировать строку по возрастанию и выдать на экран в 4 строку
Решение задачи: «Отсортировать строку по возрастанию»
textual
Листинг программы
;fasm code... org 100h jmp start start: push 0 25 250h pop di cx ax inc ah call input call sortArray jmp print input: int 21h stosb loop input ret sortArray: add cx,25 mov si,250h xor bx,bx @next: lodsb cmp al,byte[si] jbe @fuck xchg al,byte[si] mov byte[si-1],al inc bx @fuck: loop @next or bx,bx jnz sortArray mov byte[si],'$' ret print: mov ah,2 mov dh,4 xor dl,dl int 10h add ah,7 mov dx,250h int 21h exit: xor ax,ax int 16h int 20h
Объяснение кода листинга программы
На языке Assembler была написана программа для сортировки массива строк. Вот список операций, которые можно выделить в этом коде:
- org 100h — начало работы, установка точки входа в программу.
- jmp start — переход к метке
start
. - push 0 25 250h — сохранение регистров на стеке.
- pop di cx ax — восстановление значений регистров из стека.
- inc ah — увеличение значения регистра AH на единицу.
- call input — вызов функции ввода массива строк.
- call sortArray — вызов функции сортировки массива.
- jmp print — переход к метке
print
. - input: int 21h — начало работы функции ввода массива строк.
- stosb — копирование строки из видеопамяти в буфер ввода.
- loop input — повторение ввода до тех пор, пока не будет введено достаточное количество символов.
- ret — выход из функции ввода массива строк.
- sortArray: — начало работы функции сортировки массива.
- add cx,25 — увеличение значения индекса массива на 25.
- mov si,250h — установка индекса начала массива.
- xor bx,bx — обнуление значения регистра BX.
- @next: lodsb — загрузка байта из массива в регистр AL.
- cmp al,byte[si] — сравнение текущего байта с байтом в массиве по индексу SI.
- jbe @fuck — если текущий байт не больше, чем байт в массиве по индексу SI, то переход к метке
@fuck
. - xchg al,byte[si] — обмен значениями регистра AL и байта в массиве по индексу SI.
- mov byte[si-1],al — запись значения регистра AL в массив по индексу SI-1.
- inc bx — увеличение значения регистра BX на единицу.
- @fuck: loop @next — повторение цикла до тех пор, пока не будет выполнено условие выхода из цикла.
- or bx,bx — установление флага, указывающего на наличие или отсутствие элементов в массиве.
- jnz sortArray — если флаг равен нулю, то переход к метке
sortArray
. - mov byte[si],'$' — замена последнего байта в массиве символом '$'.
- ret — выход из функции сортировки массива.
- print: mov ah,2 — начало работы функции вывода отсортированного массива на экран.
- mov dh,4 — установка значения регистра DH равным 4.
- xor dl,dl — обнуление значения регистра DL.
- int 10h — вывод строки на экран.
- add ah,7 — увеличение значения регистра AH на 7.
- mov dx,250h — установка значения регистра DX равным 250.
- int 21h — вывод символа на экран.
- exit: xor ax,ax — начало работы функции завершения работы программы.
- int 16h — закрытие стандартного вывода.
- int 20h — выход из программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д