Заменить все большие семи члены массива числом 7. Подсчитать количество таких членов - Assembler
Формулировка задачи:
Задание: Задан одномерный массив. Заменить все большие семи члены массива числом 7. Подсчитать количество таких членов. Массив задать в сегменте данных или ввести с клавиатуры.
Программа запускается, но результат нет вообще никакого. Не могу ошибку найти. помогите пожалуйста)
Листинг программы
- .model small ;model pamati small
- outmsg macro msg
- mov ah,09h
- lea dx,msg
- int 21h
- endm
- .stack 100h ;stek zanimaet 256 baitov
- .data ;segment dannyh
- array db 1,8,4,5,6,2,3,4,5,9,"$"
- mess1 db "V massive $"
- mess2 db " bolshe 7 $"
- Exit_Mess db "Programma zavershena, najmite lubuyu lklavishu $"
- do db "do $"
- .code
- exit:
- ;vivod soobsheniya o vihode
- outmsg Exit_Mess
- ;ozhidanie nazhatija klavishi
- mov ah,00h ;v ah zanosim funkciju 00h
- int 16h ;vyzov preryvanija 16h
- ;vyhod iz programmy
- mov ah,4ch ;v ah zanosim funkciju 4Ch DOS
- int 21h ;vyzov preryvanija 21h
- main:
- mov ax,@data
- mov ds,ax
- mov cx,10 ;zapolnyaem schetchik
- mov si,0 ;zapolnyaem ukazatel na element massiva
- mov di,0 ;zapolnyaem kolichestvo izmeneniy
- step:
- lea ax,array[si] ; ukazivaem adres tekushego elementa
- cmp ax,7 ;sravnivaem s 7
- jg swap ;esli ax bolshe 7 to perehodim k swap
- inc si ;uvelichivaem nomer elementa
- loop step ;cikl step
- jmp last ;perehodim k poslednemu shagu
- swap:
- mov array[si],7 ;menyaem znachenie elementa na 7
- dec cx ;umenshaem schetchik
- inc si ;uvelichivaem nomer elementa
- inc di ;uvelichivaem shetchik ismeneniy
- jmp step ;perehodim k step
- ;vivodim resultat na ekran i zakrivaem programmu
- last:
- outmsg mess1
- mov ah,09h
- mov dx,di ;
- int 21h
- outmsg mess2
- jmp exit
- end main
Решение задачи: «Заменить все большие семи члены массива числом 7. Подсчитать количество таких членов»
textual
Листинг программы
- .model small ;model pamati small
- outmsg macro msg
- mov ah,09h
- lea dx,msg
- int 21h
- endm
- .stack 100h ;stek zanimaet 256 baitov
- .data ;segment dannyh
- array db 1,8,4,5,6,2,3,4,5,9,"$"
- mess1 db "V massive $"
- mess2 db " bolshe 7 $"
- Exit_Mess db "Programma zavershena, najmite lubuyu lklavishu $"
- do db "do $"
- .code
- ;procedura vyvodit chislo iz registra ax na ekran
- prints proc ;pechataet soderjimoe ax
- mov cx,10 ;v cx zanosim delitel 10
- xor di,di ;ochistka di (kolichestvo cifr v chisle)
- ;esli ax<0, to pechataem '-' i delaem ax polozhitelnym
- or ax,ax ;proveraem ax
- jns conv ;esli ax>0 (SF=0), to perehod na metku conv
- push ax ;pomeschaem ax v stek
- mov dx,'-' ;zanosim v dx '-'
- mov ah,2 ;vyvod '-' na ekran
- int 21h
- pop ax ;vosstanavlivaem ax
- neg ax ;delaem ax polozhitelnym
- conv:
- xor dx,dx ;ochistka dx
- div cx ;dl = ax mod 10,
- add dl,'0' ;perevodim ostatok v simvol
- inc di ;uvelichivaem kolichestvo cifr v chisle na 1
- push dx ;ostatok pomeschaem v stek
- or ax,ax ;proveraem ax (chastnoe)
- jnz conv ;esli ax<>0, to perehod na metku conv
- ;i povtoraem delenie
- ;vyvod cifr iz steka na ekran
- print:
- pop dx ;izvlekaem iz steka ocherednoj simvol
- mov ah,2 ;vyvodim ego na ekran
- int 21h
- dec di ;umenshaem schetchik cifr
- jnz print ;esli di<>0 (ZF=0), to perehod na metku print
- ;i povtoraem pechat' simvola
- ret ;vyhod iz procedury
- prints endp
- main:
- mov ax,@data
- mov ds,ax
- mov cx,10 ;zapolnyaem schetchik
- mov si,0 ;zapolnyaem ukazatel na element massiva
- mov di,0 ;zapolnyaem kolichestvo izmeneniy
- step:
- mov al,array[si] ; ukazivaem adres tekushego elementa
- cmp al,7 ;sravnivaem s 7
- jg swap ;esli ax bolshe 7 to perehodim k swap
- inc si ;uvelichivaem nomer elementa
- loop step ;cikl step
- jmp last ;perehodim k poslednemu shagu
- swap:
- mov array[si],7 ;menyaem znachenie elementa na 7
- dec cx ;umenshaem schetchik
- inc si ;uvelichivaem nomer elementa
- inc di ;uvelichivaem shetchik ismeneniy
- jmp step ;perehodim k step
- ;vivodim resultat na ekran i zakrivaem programmu
- last:
- mov ax,di
- call prints
- exit:
- ;vivod soobsheniya o vihode
- outmsg Exit_Mess
- ;ozhidanie nazhatija klavishi
- mov ah,00h ;v ah zanosim funkciju 00h
- int 16h ;vyzov preryvanija 16h
- ;vyhod iz programmy
- mov ah,4ch ;v ah zanosim funkciju 4Ch DOS
- int 21h ;vyzov preryvanija 21h
- end main
Объяснение кода листинга программы
- В начале объявляется размер памяти модели (
.model
) и размер стека (.stack
). - Затем идет сегмент данных (
.data
), в котором определяются:array
- массив данных с элементами разных чисел и символом$
в конце;mess1
- строка сообщенияV massive $
;mess2
- строка сообщенияbolshe 7 $
;Exit_Mess
- строка сообщенияProgramma zavershena, najmite lubuyu lklavishu $
;do
- строка сообщенияdo $
.
- Идет сегмент кода (
.code
) с определением процедуры prints для вывода содержимого регистра ax на экран. - В процедуре main:
- ax загружается адресом данных (
@data
), чтобы быть использованным в используемом регистре ds; - cx (счётчик) инициализируется значением 10;
- si устанавливается в 0 для указания текущего элемента в массиве;
- di устанавливается в 0 для отслеживания количества изменений.
- ax загружается адресом данных (
- Процедура step:
- Загружается текущий элемент массива в регистр al;
- Сравнивается значение al со значением 7, если больше, происходит переход к метке swap, иначе увеличивается si (шаг) и происходит оператор цикла
loop step
; - Процедура переходит к метке
last
.
- Процедура swap:
- Значение элемента массива заменяется на 7;
- Уменьшается cx (счётчик);
- Увеличивается si (шаг) для перехода к следующему элементу;
- Увеличивается di (количество изменений);
- Процедура переходит к метке
step
.
- Когда цикл завершен, программа переходит к выводу результата на экран и завершается.
- Последующие строки (exit и outmsg) обеспечивают вывод сообщений и ожидание нажатия клавиши перед завершением программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д