Программа посчета нулей в числах и запись их в файл - Assembler
Формулировка задачи:
Доброго времени суток.
Предупреждение - мой уровень ассемблера примерно равен 0. Особенностей этого языка не знаю, поэтому попрошу сильно не судить. Код мой, алгоритм тоже. Частично рабочий. Проблема в том, что заносит в файл В1, В2 и В3 только первое число, все остальные игнор.
задание: Разработать программу, которая отслеживает появление указанных цифр в числовом файле. Создать файл В1 с четырехзначных чисел путем ввода с клавиатуры, образуя файл В2 с цифр файла В1, имеющих один ноль, образуя файл В3 с цифр файла В1, имеющих два нуля и создать файл В4 с цифр файла В1, имеющих три нуля.
Готовый код у меня есть, только вот с самим занесением в файлы В2, В3, В4 проблема. Заносит только первое Четырехцифровое число в эти три файла, причем не обращает внимание на нуле. А должно было бы)
Комментируемый код:
Листинг программы
- org 100h
- jmp start
- b1 db 'b1.txt',0
- b2 db 'b2.txt',0
- b3 db 'b3.txt',0
- b4 db 'b4.txt',0
- k db 0 ;счетчик нулей
- handle dw ?
- handleb2 dw ?
- handleb3 dw ?
- handleb4 dw ?
- bufer db 50 DUP (?)
- bufer2 db 50 DUP (?)
- size = $ - offset bufer
- size2 = $ - offset bufer2
- start:
- mov ax, cs
- mov dx, ax
- mov es, ax
- mov ah, 3ch
- mov cx, 0
- mov dx, offset b1 ;создание файла В1
- int 21h
- mov handle, ax
- ;--------scan, check, write in file----------
- level1:
- mov ah,1
- int 21h ;считывание чисел с клавиатури
- mov dl,al
- cmp al,13 ;проверка на Enter
- je call write ;если да - переход на метку записи файла
- mov [bufer+si], al ;запис введеных даних в масив
- add si, 1
- jne level1
- level2:
- call b2proc
- call b3proc ;создание 3-х файлов "В"
- call b4proc
- call read ;процедура считывания с файла В1
- ;---------------------------------------------------proc--------------
- ;------------write to file b1-----------
- write proc
- mov ah, 42h
- mov bx, handle
- mov al, 0
- mov cx, 0
- mov dx, 0
- int 21h
- inc k
- mov ah, 40h
- mov bx, handle
- mov dx, offset bufer ;Процедура записи в В1
- mov cx, size
- int 21h
- mov ah, 3eh
- mov bx, handle
- int 21h
- write endp
- ;-----------create file b2, b3, b4------------
- b2proc proc
- mov ah, 3ch
- mov cx, 0
- mov dx, offset b2
- int 21h
- mov handleb2, ax
- b2proc endp
- b3proc proc
- mov ah, 3ch
- mov cx, 0
- mov dx, offset b3 ;создание 3-х файлов В
- int 21h
- mov handleb3, ax
- b3proc endp
- b4proc proc
- mov ah, 3ch
- mov cx, 0
- mov dx, offset b4
- int 21h
- mov handleb4, ax
- b4proc endp
- ;----------read the file b1---------
- read proc
- MOV AH,3DH
- MOV AL,0
- MOV DX,OFFSET b1
- INT 21H
- MOV HANDLE, AX
- MOV AH,3FH
- MOV BX,HANDLE
- MOV CX,512
- MOV DX,OFFSET bufer ;считывание с файла В1
- INT 21H
- CMP AX,512
- read endp
- ;----------main logic----------
- compare proc ;цикл проверки считаних чисел с В1 і записи в другие файлы
- mov cx, 50
- mov si, 0
- mov di, 0
- input:
- mov al, [bufer+si] ;заносим в регистр al si-й член масива
- cmp al, 0 ; проверяем на нуль
- je call increment ; если 0 - инкрементуєм счетчик нуля
- mov [bufer2+di],al ;записываем символ в буфер 2
- inc si
- inc di
- cmp di, 4 ; если di = 4 -
- je call crossroads ; - вызываем процедуру "crossroads"
- loop input
- compare endp
- ;----------inc k-----------
- increment proc
- inc k ;процедура инкремента счетчика нулей
- increment endp
- ;----------crossroads----------
- crossroads proc ;
- cmp k, 1 ;если к=1
- je call writeb2 ;вызываем запись в файл В2
- cmp k, 2 ;если к=2
- je call writeb3 ;вызываем запись в файл В3
- cmp k, 3 ;если к=3
- je call writeb3 ;вызываем запись в файл В2
- mov k, 0
- mov di, 0 ;обнуляєм счетчики
- inc si ;инкремент си чтоб пропустить пробел
- ;(числа в файл заносяться через "пробел")
- crossroads endp
- ;---------write to files------------
- ;---------b2---------
- writeb2 proc ;функции записи в файли числа с буфера2
- mov ah, 42h
- mov bx, handleb2
- mov al, 0
- mov cx, 0
- mov dx, 0
- int 21h
- inc k
- mov ah, 40h
- mov bx, handleb2
- mov dx, offset bufer2
- mov cx, size2
- int 21h
- mov ah, 3eh
- mov bx, handleb2
- int 21h
- writeb2 endp
- ;---------b3---------
- writeb3 proc
- mov ah, 42h
- mov bx, handleb3
- mov al, 0
- mov cx, 0
- mov dx, 0
- int 21h
- inc k
- mov ah, 40h
- mov bx, handleb3
- mov dx, offset bufer2
- mov cx, size2
- int 21h
- mov ah, 3eh
- mov bx, handleb3
- int 21h
- writeb3 endp
- ;---------b4---------
- writeb4 proc
- mov ah, 42h
- mov bx, handleb4
- mov al, 0
- mov cx, 0
- mov dx, 0
- int 21h
- inc k
- mov ah, 40h
- mov bx, handleb4
- mov dx, offset bufer2
- mov cx, size2
- int 21h
- mov ah, 3eh
- mov bx, handleb4
- int 21h
- writeb4 endp
- ret
Решение задачи: «Программа посчета нулей в числах и запись их в файл»
textual
Листинг программы
- inc Byte Ptr [b1+4]
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д