"Сократить" код программы - Assembler

Узнай цену своей работы

Формулировка задачи:

Доброй ночи) Написал я тут одну программку несложную, но мысль одна засела в голове и так и хочется найти ответ на неё) Так вот, есть некая программа (код внизу естесна:3), и есть замысел её упростить(может даже это невозможно, хз), но проблема упирается в то, что я не знаю как) Была задумка с проверкой каждой ячейки массива 80х25 на наличие такого же символа, что мы и печатаем, но почему-то мне кажется что это вышло бы длиннее самого цикла и нифига не сократило(упростило) бы код (да-да, куда ещё проще). Так что вы скажете или предложите?) (Приведу так же вариант кода, который возможно мог бы быть в качестве упрощённого, но естественно он не доработан) Работающая программа:
Листинг программы
  1. .MODEL small
  2. .STACK 100h
  3. .DATA ;
  4. a db '*'
  5. x db 0
  6. y db 0
  7. .CODE
  8. start:
  9. mov ax,@data
  10. mov ds,ax
  11. gg:
  12. mov si,0
  13. mov cx, 80
  14. mov ah,02h
  15. mov [x],1
  16. cklgg:
  17. mov dh,[x]
  18. mov dl,[y]
  19. int 10H
  20. mov dl,a[si]
  21. int 21h
  22. add [y],1
  23. loop cklgg
  24. gg2:
  25. mov si,0
  26. mov cx, 80
  27. mov ah,02h
  28. mov [x],24
  29. mov [y],0
  30. cklgg2:
  31. mov dh,[x]
  32. mov dl,[y]
  33. int 10H
  34. mov dl,a[si]
  35. int 21h
  36. add [y],1
  37. loop cklgg2
  38. wp:
  39. mov si,0
  40. mov cx, 23
  41. mov ah,02h
  42. mov [x],0
  43. mov [y],0
  44. cklwp:
  45. mov dh,[x]
  46. mov dl,[y]
  47. int 10H
  48. mov dl,a[si]
  49. int 21h
  50. add [x],1
  51. loop cklwp
  52. wp2:
  53. mov si,0
  54. mov cx, 23
  55. mov ah,02h
  56. mov [x],0
  57. mov [y],79
  58. cklwp2:
  59. mov dh,[x]
  60. mov dl,[y]
  61. int 10H
  62. mov dl,a[si]
  63. int 21h
  64. add [x],1
  65. loop cklwp2
  66. End start
Программа которая не может остановиться (Ну или я мало ждал):
Листинг программы
  1. gg:
  2. mov si,0
  3. mov cx, 80
  4. mov ah,02h
  5. mov [x],1
  6. cklgg:
  7. mov dh,[x]
  8. mov dl,[y]
  9. int 10H
  10. mov dl,a[si]
  11. int 21h
  12. add [y],1
  13. loop cklgg
  14. gg2:
  15. mov si,0
  16. mov cx, 79
  17. mov ah,02h
  18. mov [x],24
  19. mov [y],0
  20. jmp cklgg
  21. End start

Решение задачи: «"Сократить" код программы»

textual
Листинг программы
  1. org     100h
  2. begin:  mov     ax,3
  3.         int     10h
  4.         mov     ax,0b800h
  5.         mov     es,ax
  6.         xor     di,di;
  7.         mov     cx,80
  8.         mov     ax,1325h
  9.         rep     stosw
  10.         mov     cx,23
  11. l_1:    stosw
  12.         add     di,78*2
  13.         stosw
  14.         loop    l_1
  15.         mov     cx,80
  16.         rep     stosw
  17.         sub     di,2
  18.         mov     cx,24
  19.         xor     ax,ax
  20.         int     16h
  21.         ret

Объяснение кода листинга программы

Органзация кода:

  1. Переменная ax используется как аккумулятор для хранения данных и результатов операций.
  2. Переменная cx используется для хранения количества повторений операций.
  3. Переменная es используется как сегментный регистр для доступа к памяти.
  4. Переменная di используется как индексный регистр для доступа к памяти. Описание действий:
  5. Код начинает выполняться с адреса 100h.
  6. Переменная ax устанавливается равной 3.
  7. Выполняется команда int 10h, которая используется для вывода символа на экран.
  8. Переменная ax устанавливается равной 0b800h, что является сегментом кода в реальном режиме.
  9. Переменная es устанавливается равной ax, что позволяет использовать сегмент кода для доступа к памяти.
  10. Переменная di инициализируется как 0.
  11. Переменная cx устанавливается равной 80.
  12. Переменная ax устанавливается равной 1325h, что является сегментом данных в реальном режиме.
  13. Команда rep stosw используется для заполнения первых 80 байтов памяти от начала сегмента данных значением 0.
  14. Переменная cx устанавливается равной 23.
  15. В цикле l_1 происходит запись значения 0 в память с использованием команды stosw, при этом переменная di увеличивается на 78*2.
  16. После завершения цикла l_1 происходит проверка на равенство di нулю, и если это не так, то происходит переход к шагу 11.
  17. Переменная cx устанавливается равной 80.
  18. Команда rep stosw используется для заполнения последних 24 байтов памяти от начала сегмента данных значением 0.
  19. Переменная di уменьшается на 2.
  20. Переменная cx устанавливается равной 24.
  21. Переменная ax устанавливается равной 0.
  22. Команда int 16h используется для прерывания и возврата управления в операционную систему.
  23. Команда ret используется для возврата управления в вызывающую программу.

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


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

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

13   голосов , оценка 4.154 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут