Заменить все большие семи члены массива числом 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

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

  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
Похожие ответы