首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查是否存在newLine YASM 8086

如何检查是否存在newLine YASM 8086
EN

Stack Overflow用户
提问于 2022-12-04 17:42:15
回答 1查看 35关注 0票数 1

我一直在做这个项目。主要目的是计算有多少单词不包含字母从a到k。给定文件有0;1000行。每一行包含6列。

前两列包含1;20个字符的字符串。字符可以是字母、数字和空格。

3-5列包含范围为- 100;100的整数。第6列包含范围内的实数- 9.99;9.99,小数点后只有两位数。

每一段我用分号分隔。

代码语言:javascript
复制
helloA;lB;lC;lD;lE;lF
A11;bas morning;0;0;5;1.15

我的问题是,如果文件末尾有一个newLine,跳过它们,并在最后计数中对它们进行汇总。

任务:计算前两列中没有“”(空格)的单词(单词是一个或多个符号),不包含字母'B‘或'C’。然后打印那个整数。

我试着将al和0x20进行比较,如果它更小,就跳到下一节,但这对我没有帮助。

我至今所做的一切

代码语言:javascript
复制
        ; 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

**我的档案:**

代码语言:javascript
复制
XYZ;PPP;1;1;1;1.00
A11;bas aaa;0;0;5;1.15

My输出:4

需要输出:2(因为好的只有两个“好”单词"XYZ“和"PPP"),我的程序在newLine中多计算两个单词。

EN

回答 1

Stack Overflow用户

发布于 2022-12-04 20:37:56

看起来,与最初的任务描述不同,您的文件也可以包含一个或多个空行。

要处理这些空行(只包含字节13和10),跳过32以下的代码是个好主意,但这是错误的。

下面是快速修复。请注意,ASCII代码将被视为无符号数字。不要对它们使用签名的jl指令。

代码语言:javascript
复制
            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

我用感叹号标记的行实际上应该是:

代码语言:javascript
复制
        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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74679234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档