ассемблеру 8086 нужна помощь по устранению проблемы - PullRequest
0 голосов
/ 25 ноября 2018

Я мог бы использовать вашу помощь в программе, которую я пишу, в качестве школьного проекта.Он должен открыть файл, который содержит около 3000 строк, который содержит пять полей, разделенных «;».Первое поле с буквами (оно может быть не более 10 символов), остальные поля - числа в диапазоне от -100 до 100. Это должно выглядеть примерно так:

DSGHAA; 12; 24; 55; -84

Задание состоит в том, что мне нужно открыть файл, содержащий эти строки, и проверить, соответствует ли строка некоторым требованиям, и, если она соответствует им, записать эту строку в другой файл, который будет создан.,Требования, которые необходимо выполнить: 1. В первом поле должно быть две буквы «А» (не больше, не меньше) (не более 10 символов);2. Второе и третье поля имеют положительные числа;3. Четвертое и пятое поля должны делиться из 11;Вот часть моего кода:

-----------------Reading characters--------------------
.beginning
    inc di
    mov bx, [bp]              
    mov cx, 1
    mov dx, character
    mov ah, 0x3F
    int 0x21
    mov cl, [character]
    jnc .tikrinimas
    macPutString 'Error reading file', crlf, '$'

---------Checking if it isn't end of reading file------ 

.startChecking
    cmp ax, 0
    jne .ifLineEnd
    jmp .closing

---------Checking if it is the end of line-------------
.ifLineEnds
    cmp cl, 0x0A
    je .splitLine
    mov [line+di], cl
    jmp .beginning

---------Startting to split my line into "fields"------ 
.splitLine
    mov [line+di], cl
    mov si, 0
    mov di, 0
    .firstField
        mov al, byte [line+di]
        mov byte [field1+si], al
        cmp byte [line+di], ';'
        je .splitLine2
        inc di
        inc si
        loop .firstField

.splitLine2
    mov si, 0
    inc di
    .secondField
        mov al, byte [line+di]
        mov byte [field2+si], al
        cmp byte [line+di], ';'
        je .splitLine3
        inc di
        inc si
        loop .secondField

.splitLine3
    mov si, 0
    inc di
    .thirdField
        mov al, byte [line+di]
        mov byte [field3+si], al
        cmp byte [line+di], ';'
        je .splitLine4
        inc di
        inc si
        loop .thirdField

.splitLine4
    mov si, 0
    inc di
    .fourthField
        mov al, byte [line+di]
        mov byte [field4+si], al
        cmp byte [line+di], ';'
        je .splitLine5
        inc di
        inc si
        loop .fourthField

.splitLine5
    mov si, 0
    inc di
    .fifthField
        mov al, byte [line+di]
        mov byte [field5+si], al
        cmp byte [line+di], ';'
        je .howManyA               <----This is where I have a problem..
        inc di
        inc si
        loop .fifthField

-------counting how many "A" are in first field-------  
.howManyA
    mov si, 0
    mov ch, 0
    .check
        cmp byte [field1+si], ';'
        je .numberA
        cmp byte [field1+si], 'A'
        jne .next
        inc ch
        inc si
        jmp .check
        .next
            inc si
            jmp .check

    .numberA
        cmp ch, 2
        je .isFirstPositive
        jmp .toBeginning

--------checking if first number is positive----------      
.isFirstPositive
    mov ch, byte [field2]
    cmp ch, 0x2D
    jne .isSecondPositive
    jmp .toBeginning

--------checking if second number is positive---------      
.isSecondPositive
    mov ch, byte [field3]
    cmp ch, 0xD2
    jmp .toBeginning

--------checking if third number divides from 11------  
.firstDivide
    mov ah, byte [field4]
    cmp ax, 0
    je .toBeginning
    cmp ah, 0xD2
    je .numbers
       .numbers
            mov ah, byte [laukas4+01]
            mov al, byte [laukas4+02]
    cmp ah, al
    je .secondDivide
    jmp .toBeginning

------checking if fourth number divides from 11------
.secondBeggining
    mov ah, [field5+00]
    cmp ax, 0
    je .toBeginning
    cmp ah, 0xD2
    je .numbers2
        .numbers2
            mov ah, byte [field5+01]
            mov al, byte [field5+02]
    cmp ah, al
    je .writeToFile
    jmp .toBeginning

-----------jumping to beginning to read another line---------       
.toBeginning
    mov di, -1
    jmp .beginning


---------------data----------------------------------
section .data

character: times 1 db 00
line: times 32 db 00
field1: times 11 db 00
field2: times 5 db 00
field3: times 5 db 00
field4: times 5 db 00
field5: times 5 db 00

Я пропустил части кода, где открываются, создаются, пишутся и закрываются файлы.Это работает.Я показал в своем коде, где есть проблема, и я не могу определить, почему .. У меня есть тестовый файл

input.txt, содержащий эту строку "AA; 12; 15; 55;-77

Теперь, когда я отлаживаю свою программу, все работает отлично, пока не достигнет первого значения «7.» Программа сравнивает «7» (ASCII 37) с «;» (ASCII 3B) и переходит к«.howManyA». Я не могу понять, почему он это делает и на что обращать внимание. Любая помощь будет принята с благодарностью.

...