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