Вывести количество четных символов в массиве из 20 чисел. (Код есть) - Assembler

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

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

Добрый день, товарищи! Нужно вывести количество четных символов в массиве из 20 чисел. Код есть, но почему то, когда я запускаю батник создается только *LST *MAP, а *EXE файла нет. В чем проблема, кто подскажет? Буду очень благодарен! В ассемблере разбираюсь не очень хорошо
DATA SEGMENT  ; Открыть сегмент данных
  MAS DW 1,2,-3,4,5,6,7,-8,9,10,11,-12,13,14,15,-16,17,18,19,20  ; Определить массив из 20 чисел
  N DW (?)                                                                                          ; Определить байтовую переменную N
  N_ASCII DB 'Kolichestvo chetnih chisel v massive ='; Определить массив символов
DATA ENDS  ; Закрыть сегмент данных
STK SEGMENT  ; Открыть сегмент стека
  DB 100 DUP (?) ; Определить стек длиной 100 байт
STK ENDS  ; Закрыть сегмент стека
ASSUME DS:DATA, CS:CODE, SS:STK ; Задать соответствия сегментов
 
CODE SEGMENT ; открыть сегмент кода
START:
  MOV AX, DATA ; инициализировать 
  MOV DS, AX  ; сегментный регистр DS
  MOV CX, 20 ; Задать счетчик для цикла
  MOV SI, 00 ; Задать счетчик для массива MAS
  MOV DI, 00  ; Занести в BL значение 0
 
MET1:
  MOV AX, MAS[SI]  ; Занести в AX SI-ый элемент массива 
 
MAS
  AND AX, 1   ; логическое AND для числа и единицы
  ADD SI, 2    ; SI := SI + 2, Элемент массива MAS +1
  CMP AX, 0  ; Сравнить значение остатка с 0
  JZ MET2    ; Если остаток равен 0, перейти к MET2
  LOOP MET1  ; CX := CX - 1, перейти к метке MET1
  JMP EXIT    ; перейти к метке EXIT
 
MET2:
  ADD DI, 01  ; Добавить единицу к BL  
  SUB CX, 01  ; Отнять от CX единицу
  CMP CX, 00   ; Сравнить CX c 00
  JZ EXIT   ; Если счетчик цикла =0, перейти к EXIT
  JMP MET1   ; Вернуться к метке MET1
 
EXIT:
  MOV N, DI ; N := (DI)
  CMP DI, 10 ; сравнить N и число 10
  JC MET3   ; если (DI) < 10 перейти к MET3
  MOV AX, N ; занести значение N в AX
  MOV BL, 10  ; Занести в BL делитель равный 10
  DIV BL     ; разделить (AX) на 10
  MOV DH, AH    ; Занести в DH остаток от деления
  ADD AX, 30H     ; Получить из числа символ
  MOV N_ASCII[39], AL  ; занести в N_ASCII
  ADD DH, 30H        ; Получить из числа символ 
  MOV N_ASCII[40], DH  ; занести в N_ASCII
  MOV N_ASCII[41], '$'  ; добавить к N_ASCII конец строки
  MOV AH,09h           ; вывести N_ASCII
  MOV DX, offset N_ASCII   ; указав смещение в DX
  INT 21h     ; на экран
 
EXIT2:         
  MOV AX, 4C00H     ; Корректно завершить
  INT 21H          ; программу
 
MET3:
  MOV AX, DI    ; занести значение DI в AX
  ADD AX, 30H      ; Получить из числа символ
  MOV N_ASCII[39], AL   ; добавить к N_ASCII конец строки
  MOV N_ASCII[40], '$'  ; добавить к N_ASCII конец строки
  MOV AH,09H        ; вывести N_ASCII
  MOV DX, offset N_ASCII  ; указав смещение в DX
  INT 21h                 ; на экран
  JMP EXIT2           ; перейти к метке EXIT2
 
CODE ENDS            ; закрыть сегмент кода
  END START
И как добавить мой текст, который я хочу вывести перед ответом?
Точнее, нужно добавить все числа, которые были использованы.

Решение задачи: «Вывести количество четных символов в массиве из 20 чисел. (Код есть)»

textual
Листинг программы
inc count   ;увеличиваем счетчик четных чисел
 
skip:       ;метка skip       
loop check  ;переход к загрузке следующего элемента массива, пока не будут пройдены все элементы            
 
mov ax,count;помещаем количество найденных четных чисел в регистр ax        
mov bx,10   ;будем откалывать цифры от количества в десятичной системе счисления
xor cx,cx   ;обнуление регистра cx, в котором будет накапливаться количество цифр в количестве найденных
give:       ;метка give
xor dx,dx   ;обнуляем старшую часть делимого, т.к. деление будет происходить dx:ax на bx
idiv bx     ;делим, после деления: в регистре ax - частное, в регистре dx - остаток (отколотая цифра)
push dx     ;пихаем отколотую цифру в стек
inc cx      ;увеличиваем количество отколотых цифр
 
or ax,ax    ;проверяем частное на равность нулю 
jnz give    ;если не равно нулю, то дальше будем откалывать
 
mov ah,09h  ;функция вывода сообщения на консоль
lea dx,msg  ;загружаем адрес строки-подсказки
lea dx,msg1 ;эта строка здесь совсем не к месту!!!
int 21h     ;прерывание, чтобы функция выполнилась
 
mov ah,02h  ;функция вывода символа на консоль
get:        ;метка get
pop dx      ;достаем из стека крайнюю отколотую цифру
add dl,30h  ;преобразуем цифру в ASCII-код
int 21h     ;прерывание, чтобы функция выполнилась
loop get    ;к следующей отколотой цифре

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

13   голосов , оценка 3.923 из 5
Похожие ответы