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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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