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

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

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

Доброй ночи) Написал я тут одну программку несложную, но мысль одна засела в голове и так и хочется найти ответ на неё) Так вот, есть некая программа (код внизу естесна:3), и есть замысел её упростить(может даже это невозможно, хз), но проблема упирается в то, что я не знаю как) Была задумка с проверкой каждой ячейки массива 80х25 на наличие такого же символа, что мы и печатаем, но почему-то мне кажется что это вышло бы длиннее самого цикла и нифига не сократило(упростило) бы код (да-да, куда ещё проще). Так что вы скажете или предложите?) (Приведу так же вариант кода, который возможно мог бы быть в качестве упрощённого, но естественно он не доработан) Работающая программа:
.MODEL small        
.STACK 100h     
.DATA  ;
    a   db '*'
    x   db 0
    y   db 0
 .CODE
start:
   mov ax,@data         
   mov ds,ax           
 
gg:
   mov si,0         
   mov cx, 80      
   mov ah,02h    
   mov [x],1  
cklgg:   
   mov dh,[x]            
   mov dl,[y]    
   int 10H        
   mov dl,a[si] 
   int 21h           
   add [y],1  
   loop cklgg
gg2: 
   mov si,0 
   mov cx, 80 
   mov ah,02h 
   mov [x],24
   mov [y],0 
cklgg2:
   mov dh,[x]            
   mov dl,[y]    
   int 10H        
   mov dl,a[si] 
   int 21h           
   add [y],1  
   loop cklgg2
wp:
   mov si,0       
   mov cx, 23      
   mov ah,02h    
   mov [x],0
   mov [y],0
cklwp:   
   mov dh,[x]            
   mov dl,[y]    
   int 10H        
   mov dl,a[si] 
   int 21h           
   add [x],1  
   loop cklwp
wp2:
   mov si,0     
   mov cx, 23      
   mov ah,02h    
   mov [x],0
   mov [y],79
cklwp2:   
   mov dh,[x]            
   mov dl,[y]    
   int 10H        
   mov dl,a[si] 
   int 21h           
   add [x],1  
   loop cklwp2
   End start
Программа которая не может остановиться (Ну или я мало ждал):
gg:
   mov si,0         
   mov cx, 80      
   mov ah,02h    
   mov [x],1  
cklgg:   
   mov dh,[x]            
   mov dl,[y]    
   int 10H        
   mov dl,a[si] 
   int 21h           
   add [y],1  
   loop cklgg
gg2: 
   mov si,0 
   mov cx, 79 
   mov ah,02h 
   mov [x],24
   mov [y],0 
   jmp cklgg 
   End start

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

textual
Листинг программы
org     100h
begin:  mov     ax,3
        int     10h
        mov     ax,0b800h
        mov     es,ax
        xor     di,di;
        mov     cx,80
        mov     ax,1325h
        rep     stosw
        mov     cx,23
l_1:    stosw
        add     di,78*2
        stosw
        loop    l_1
        mov     cx,80
        rep     stosw
        sub     di,2
        mov     cx,24
        xor     ax,ax
        int     16h
        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