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