汇编程序8086需要帮助解决问题

时间:2018-11-25 13:12:58

标签: assembly x86 x86-16

我可以在您作为学校项目编写的程序上使用您的帮助。它必须打开一个文件,该文件包含约3000行,其中包含由“;”分隔的五个字段。第一个字段是字母(最多10个字符),其他字段是-100到100范围内的数字。它看起来应该像这样:

  

DSGHAA; 12; 24; 55; -84

任务是我必须打开包含这些行的文件,并检查该行是否满足某些要求,如果满足要求,则将该行写入将要创建的另一个文件。 需要满足的要求: 1.在第一个字段中必须有两个“ A”字母(不超过,不少于)(最多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”。我不知道为什么会那样做以及要寻找什么。 任何帮助,将不胜感激。

0 个答案:

没有答案