I have one line of text in my input file, which is divided into six columns. Columns are separated from each other by a semicolon.
Here is input file example:
A1;example;10;0;55;2.44
I am looking only into third column number. In this case it would be number 10, so the sum of its digits is 1. According to the task requirements, the sum has to be 7
I read the line, save it into buffer. Then byte by byte I move to the place where third comumn starts.
; Save line into buffer
call procGetLine
; Skip one column
mov di, inputBuffer
.whileNotSemicolon:
cmp di, byte ';'
je .semicolon
inc di
jmp .whileNotSemicolon
.semicolon:
inc di
; Do some calculations with second column and move to the start of third column
; ............
; Call function that calculates sum of number digits in third column
call procDigitsSum
cmp [digitsSum], word 7
je .isSeven
procDigitsSum function:
procDigitsSum
push si
push ax
push dx
push cx
push bx
mov [digitsSum], word 0
mov si, 0
.loop:
mov cl, [di]
inc di
cmp cl, byte ';'
je .columnEnd
; ASCIIZ for using it in function later
mov byte [thirdColumnNumber+si], cl
mov byte [thirdColumnNumber+si+1], 0
inc si
jmp .loop
.columnEnd
mov dx, thirdColumnNumber
mov di, dx
.secondLoop:
; Guessing mistake lies somewhere here
mov dl, [di]
inc di
cmp dl, byte 0
je .endLoop
add [digitsSum], dl
add [digitsSum], byte 30h
jmp .secondLoop
.endLoop
pop bx
pop cx
pop dx
pop ax
pop si
ret
procGetLine function just in case, however it seems to work fine:
procGetLine:
push ax
push bx
push cx
push si
mov bx, [inputFileDescriptor]
mov si, 0
.loop
call procFGetChar
cmp ax, 0
je .endOfFile
jc .endOfFile
mov [inputBuffer+si], cl
inc si
cmp cl, 0Ah
je .endOfLine
jmp .loop
.endOfFile:
mov [lastLine], byte 1
.endOfLine:
mov [inputBuffer+si], byte '$'
mov [bytesRead], si
pop si
pop cx
pop bx
pop ax
ret