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