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