我一直在做这个项目。主要目的是计算有多少单词不包含字母从a到k。给定文件有0;1000行。每一行包含6列。
前两列包含1;20个字符的字符串。字符可以是字母、数字和空格。
3-5列包含范围为- 100;100的整数。第6列包含范围内的实数- 9.99;9.99,小数点后只有两位数。
每一段我用分号分隔。
helloA;lB;lC;lD;lE;lF
A11;bas morning;0;0;5;1.15我的问题是,如果文件末尾有一个newLine,跳过它们,并在最后计数中对它们进行汇总。
任务:计算前两列中没有“”(空格)的单词(单词是一个或多个符号),不包含字母'B‘或'C’。然后打印那个整数。
我试着将al和0x20进行比较,如果它更小,就跳到下一节,但这对我没有帮助。
我至今所做的一切
; Main
.whileNotTheEndOfFile:
mov si, 2
call procSkaitytiEilute
; Check the first two columns
;mov al, ';'
mov di, line
.skipSpaces:
mov al, [di]
inc di
cmp al, ' '
je .skipSpaces
cmp al, ';'
je .q3
dec di
.checkWord:
mov bx, 1
.q1:
mov al, [di]
inc di
cmp al, ' '
je .q2
cmp al, ';'
je .q2
jmp .q8
.q8:
cmp al, 20h
jl .skipLine
jmp .q7
.q7:
cmp al, 'A'
jl .q5
jmp .q4
.q4:
cmp al, 'K'
jae .q5
mov bx, 0 ; One or more invalid chars in current word
jmp .q1
.q5:
cmp al, 'a'
jae .q6
jmp .q1
.q6:
cmp al, 'k'
jae .q1
mov bx, 0
jmp .q1
.q2:
add [lineCount], bx ; BX=[0,1] Counting the 'good' words
cmp al, ';'
jne .skipSpaces
.q3:
dec si ; Next column?
jnz .skipSpaces
.skipLine:
cmp [readLastLine], byte 0
je .whileNotTheEndOfFile
; Jeigu ne failo pabaiga, kartojame cikla
.skipLine:
sub [lineCount], 2
cmp [readLastLine], byte 0
je .whileNotTheEndOfFile
; Hexadecimal convertion to decimal
mov dx, lineCount
mov ax, [lineCount]
call procUInt16ToStr
call procPutStr
macNewLine
mov si, dx
.writeToFile:
lodsb
cmp al, 0
jne .writeToFile
sub si, dx
lea cx, [si-1]
mov bx, [writingDescriptor]
mov ah, 40h
int 21h
; Closing Files
.end:
mov bx, [writingDescriptor]
call procFClose
.rasymoKlaida:
mov bx, [readingDescriptor]
call procFClose
exit
%include 'yasmlib.asm'
; void procSkaitytiEilute()
; Read line to buffer ‘eilute’
procReadLine:
push ax
push bx
push cx
push si
mov bx, [readingDescriptor]
mov si, 0
.loop:
call procFGetChar
; End if the end of file or error
cmp ax, 0
je .endOfFile
jc .endOfFile
; Putting symbol to buffer
mov [line+si], cl
inc si
; Check if there is \n?
cmp cl, 0x0A
je .endOfLine
jmp .loop
.endOfFile:
mov [readLastLine], byte 1
.endOfLine:
mov [line+si], byte '$'
mov [lineLength], si
pop si
pop cx
pop bx
pop ax
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section .data
readingFile:
db 'input.dat', 00
readingDescriptor:
dw 0000
writingFile:
times 128 db 00
writingDescriptor:
dw 0000
readLastLine:
db 00
line:
db 64
times 66 db '$'
lineLength:
dw 0000
lineCount:
times 128 db 00**我的档案:**
XYZ;PPP;1;1;1;1.00
A11;bas aaa;0;0;5;1.15My输出:4
需要输出:2(因为好的只有两个“好”单词"XYZ“和"PPP"),我的程序在newLine中多计算两个单词。
发布于 2022-12-04 20:37:56
看起来,与最初的任务描述不同,您的文件也可以包含一个或多个空行。
要处理这些空行(只包含字节13和10),跳过32以下的代码是个好主意,但这是错误的。
下面是快速修复。请注意,ASCII代码将被视为无符号数字。不要对它们使用签名的jl指令。
mov di, line
mov al, [di] ; NEW
cmp al, 32 ; NEW
jb .skipLine ; NEW
.skipSpaces:
mov al, [di]
inc di
cmp al, ' '
je .skipSpaces
cmp al, ';'
je .q3
dec di
.checkWord:
mov bx, 1
.q1:
mov al, [di]
inc di
cmp al, ' '
je .q2
cmp al, ';'
je .q2
! cmp al, 'A'
! jb .q1
! cmp al, 'K'
! jbe .badChar ; [A,K] is bad
! cmp al, 'a'
! jb .q1
! cmp al, 'k'
! ja .q1
! .badChar: ; [a,k] is bad
! mov bx, 0 ; One or more invalid chars in current word
jmp .q1
.q2:
add [lineCount], bx ; BX=[0,1] Counting the 'good' words
cmp al, ';'
jne .skipSpaces
.q3:
dec si ; Next column?
jnz .skipSpaces
.skipLine:
cmp [readLastLine], byte 0
je .whileNotTheEndOfFile我用感叹号标记的行实际上应该是:
or al, 32 ; Make lowercase
cmp al, 'a'
jb .q1
cmp al, 'k'
ja .q1
mov bx, 0 ; [A,K] and [a,k] are badChars为什么您的程序包含下一个冗余行?
; Jeigu ne failo pabaiga, kartojame cikla .skipLine: sub [lineCount], 2 cmp [readLastLine], byte 0 je .whileNotTheEndOfFile
https://stackoverflow.com/questions/74679234
复制相似问题