Заменить все большие семи члены массива числом 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) обеспечивают вывод сообщений и ожидание нажатия клавиши перед завершением программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д