我可以在您作为学校项目编写的程序上使用您的帮助。它必须打开一个文件,该文件包含约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”。我不知道为什么会那样做以及要寻找什么。 任何帮助,将不胜感激。