Программа посчета нулей в числах и запись их в файл - 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]