Заменить все большие семи члены массива числом 7. Подсчитать количество таких членов - Assembler

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

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

Задание: Задан одномерный массив. Заменить все большие семи члены массива числом 7. Подсчитать количество таких членов. Массив задать в сегменте данных или ввести с клавиатуры. Программа запускается, но результат нет вообще никакого. Не могу ошибку найти. помогите пожалуйста)
Листинг программы
  1. .model small ;model pamati small
  2. outmsg macro msg
  3. mov ah,09h
  4. lea dx,msg
  5. int 21h
  6. endm
  7. .stack 100h ;stek zanimaet 256 baitov
  8. .data ;segment dannyh
  9. array db 1,8,4,5,6,2,3,4,5,9,"$"
  10. mess1 db "V massive $"
  11. mess2 db " bolshe 7 $"
  12. Exit_Mess db "Programma zavershena, najmite lubuyu lklavishu $"
  13. do db "do $"
  14. .code
  15.  
  16. exit:
  17. ;vivod soobsheniya o vihode
  18. outmsg Exit_Mess
  19. ;ozhidanie nazhatija klavishi
  20. mov ah,00h ;v ah zanosim funkciju 00h
  21. int 16h ;vyzov preryvanija 16h
  22. ;vyhod iz programmy
  23. mov ah,4ch ;v ah zanosim funkciju 4Ch DOS
  24. int 21h ;vyzov preryvanija 21h
  25. main:
  26. mov ax,@data
  27. mov ds,ax
  28. mov cx,10 ;zapolnyaem schetchik
  29. mov si,0 ;zapolnyaem ukazatel na element massiva
  30. mov di,0 ;zapolnyaem kolichestvo izmeneniy
  31. step:
  32. lea ax,array[si] ; ukazivaem adres tekushego elementa
  33. cmp ax,7 ;sravnivaem s 7
  34. jg swap ;esli ax bolshe 7 to perehodim k swap
  35. inc si ;uvelichivaem nomer elementa
  36. loop step ;cikl step
  37. jmp last ;perehodim k poslednemu shagu
  38. swap:
  39. mov array[si],7 ;menyaem znachenie elementa na 7
  40. dec cx ;umenshaem schetchik
  41. inc si ;uvelichivaem nomer elementa
  42. inc di ;uvelichivaem shetchik ismeneniy
  43. jmp step ;perehodim k step
  44. ;vivodim resultat na ekran i zakrivaem programmu
  45. last:
  46. outmsg mess1
  47. mov ah,09h
  48. mov dx,di ;
  49. int 21h
  50. outmsg mess2
  51. jmp exit
  52. end main

Решение задачи: «Заменить все большие семи члены массива числом 7. Подсчитать количество таких членов»

textual
Листинг программы
  1. .model small              ;model pamati small
  2. outmsg macro msg
  3.     mov ah,09h
  4.     lea dx,msg
  5.     int 21h
  6. endm
  7. .stack 100h              ;stek zanimaet 256 baitov
  8. .data                     ;segment dannyh
  9.     array db 1,8,4,5,6,2,3,4,5,9,"$"
  10.     mess1 db "V massive $"
  11.     mess2 db " bolshe 7 $"
  12.     Exit_Mess db "Programma zavershena, najmite lubuyu lklavishu $"
  13.     do db "do $"
  14. .code
  15. ;procedura vyvodit chislo iz registra ax na ekran
  16. prints proc  ;pechataet soderjimoe ax
  17.       mov cx,10         ;v cx zanosim delitel 10
  18.     xor di,di           ;ochistka di (kolichestvo cifr v chisle)
  19.     ;esli ax<0, to pechataem '-' i delaem ax polozhitelnym
  20.     or ax,ax            ;proveraem ax
  21.     jns conv            ;esli ax>0 (SF=0), to perehod na metku conv
  22.     push ax             ;pomeschaem ax v stek
  23.     mov dx,'-'          ;zanosim v dx '-'
  24.     mov ah,2                ;vyvod '-' na ekran
  25.     int 21h
  26.     pop ax              ;vosstanavlivaem ax
  27.     neg ax              ;delaem ax polozhitelnym
  28.  conv:
  29.     xor dx,dx           ;ochistka dx
  30.     div cx                      ;dl = ax mod 10,
  31.     add dl,'0'          ;perevodim ostatok v simvol
  32.     inc di              ;uvelichivaem kolichestvo cifr v chisle na 1
  33.     push dx                     ;ostatok pomeschaem v stek
  34.     or ax,ax            ;proveraem ax (chastnoe)
  35.     jnz conv            ;esli ax<>0, to perehod na metku conv
  36.                     ;i povtoraem delenie
  37.     ;vyvod cifr iz steka na ekran
  38. print:
  39.     pop dx              ;izvlekaem iz steka ocherednoj simvol
  40.     mov ah,2            ;vyvodim ego na ekran
  41.     int 21h
  42.     dec di              ;umenshaem schetchik cifr
  43.     jnz print           ;esli di<>0 (ZF=0), to perehod na metku print
  44.                     ;i povtoraem pechat' simvola
  45.     ret             ;vyhod iz procedury          
  46. prints endp    
  47.  
  48. main:  
  49.     mov ax,@data
  50.     mov ds,ax
  51.     mov cx,10 ;zapolnyaem schetchik
  52.     mov si,0   ;zapolnyaem ukazatel na element massiva
  53.     mov di,0    ;zapolnyaem kolichestvo izmeneniy
  54.  
  55. step:
  56.    
  57.     mov al,array[si] ; ukazivaem adres tekushego elementa
  58.     cmp al,7    ;sravnivaem s 7
  59.     jg swap     ;esli ax bolshe 7 to perehodim k swap
  60.     inc si    ;uvelichivaem nomer elementa
  61.     loop step ;cikl step
  62.     jmp last    ;perehodim k poslednemu shagu
  63.    
  64. swap:
  65.     mov array[si],7 ;menyaem znachenie elementa na 7
  66.     dec cx  ;umenshaem schetchik
  67.     inc si  ;uvelichivaem nomer elementa
  68.     inc di  ;uvelichivaem shetchik ismeneniy
  69.     jmp step   ;perehodim k step
  70.    
  71.  ;vivodim resultat na ekran i zakrivaem programmu  
  72. last:
  73.     mov ax,di
  74.     call prints
  75. exit:
  76.     ;vivod soobsheniya o vihode
  77.     outmsg Exit_Mess      
  78.     ;ozhidanie nazhatija klavishi
  79.      mov ah,00h          ;v ah zanosim funkciju 00h  
  80.      int 16h             ;vyzov preryvanija 16h
  81.     ;vyhod iz programmy  
  82.      mov ah,4ch          ;v ah zanosim funkciju 4Ch DOS  
  83.      int 21h             ;vyzov preryvanija 21h    
  84. end main

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

  1. В начале объявляется размер памяти модели (.model) и размер стека (.stack).
  2. Затем идет сегмент данных (.data), в котором определяются:
    • array - массив данных с элементами разных чисел и символом $ в конце;
    • mess1 - строка сообщения V massive $;
    • mess2 - строка сообщения bolshe 7 $;
    • Exit_Mess - строка сообщения Programma zavershena, najmite lubuyu lklavishu $;
    • do - строка сообщения do $.
  3. Идет сегмент кода (.code) с определением процедуры prints для вывода содержимого регистра ax на экран.
  4. В процедуре main:
    • ax загружается адресом данных (@data), чтобы быть использованным в используемом регистре ds;
    • cx (счётчик) инициализируется значением 10;
    • si устанавливается в 0 для указания текущего элемента в массиве;
    • di устанавливается в 0 для отслеживания количества изменений.
  5. Процедура step:
    • Загружается текущий элемент массива в регистр al;
    • Сравнивается значение al со значением 7, если больше, происходит переход к метке swap, иначе увеличивается si (шаг) и происходит оператор цикла loop step;
    • Процедура переходит к метке last.
  6. Процедура swap:
    • Значение элемента массива заменяется на 7;
    • Уменьшается cx (счётчик);
    • Увеличивается si (шаг) для перехода к следующему элементу;
    • Увеличивается di (количество изменений);
    • Процедура переходит к метке step.
  7. Когда цикл завершен, программа переходит к выводу результата на экран и завершается.
  8. Последующие строки (exit и outmsg) обеспечивают вывод сообщений и ожидание нажатия клавиши перед завершением программы.

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


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

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

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

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

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

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