Отсортировать строку по возрастанию - 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 была написана программа для сортировки массива строк. Вот список операций, которые можно выделить в этом коде:

  1. org 100h — начало работы, установка точки входа в программу.
  2. jmp start — переход к метке start.
  3. push 0 25 250h — сохранение регистров на стеке.
  4. pop di cx ax — восстановление значений регистров из стека.
  5. inc ah — увеличение значения регистра AH на единицу.
  6. call input — вызов функции ввода массива строк.
  7. call sortArray — вызов функции сортировки массива.
  8. jmp print — переход к метке print.
  9. input: int 21h — начало работы функции ввода массива строк.
  10. stosb — копирование строки из видеопамяти в буфер ввода.
  11. loop input — повторение ввода до тех пор, пока не будет введено достаточное количество символов.
  12. ret — выход из функции ввода массива строк.
  13. sortArray: — начало работы функции сортировки массива.
  14. add cx,25 — увеличение значения индекса массива на 25.
  15. mov si,250h — установка индекса начала массива.
  16. xor bx,bx — обнуление значения регистра BX.
  17. @next: lodsb — загрузка байта из массива в регистр AL.
  18. cmp al,byte[si] — сравнение текущего байта с байтом в массиве по индексу SI.
  19. jbe @fuck — если текущий байт не больше, чем байт в массиве по индексу SI, то переход к метке @fuck.
  20. xchg al,byte[si] — обмен значениями регистра AL и байта в массиве по индексу SI.
  21. mov byte[si-1],al — запись значения регистра AL в массив по индексу SI-1.
  22. inc bx — увеличение значения регистра BX на единицу.
  23. @fuck: loop @next — повторение цикла до тех пор, пока не будет выполнено условие выхода из цикла.
  24. or bx,bx — установление флага, указывающего на наличие или отсутствие элементов в массиве.
  25. jnz sortArray — если флаг равен нулю, то переход к метке sortArray.
  26. mov byte[si],'$' — замена последнего байта в массиве символом '$'.
  27. ret — выход из функции сортировки массива.
  28. print: mov ah,2 — начало работы функции вывода отсортированного массива на экран.
  29. mov dh,4 — установка значения регистра DH равным 4.
  30. xor dl,dl — обнуление значения регистра DL.
  31. int 10h — вывод строки на экран.
  32. add ah,7 — увеличение значения регистра AH на 7.
  33. mov dx,250h — установка значения регистра DX равным 250.
  34. int 21h — вывод символа на экран.
  35. exit: xor ax,ax — начало работы функции завершения работы программы.
  36. int 16h — закрытие стандартного вывода.
  37. int 20h — выход из программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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