Assembly 寻找新线

Assembly 寻找新线,assembly,dos,16-bit,real-mode,Assembly,Dos,16 Bit,Real Mode,我是汇编新手,我的任务是读取文件名并打印此文件中的偶数行。我不知道如何找到一条新线路。我知道我必须去CMP13和CMP10,因为那是回车,但我没有成功。任何帮助都将不胜感激。以下是我目前掌握的情况: assume cs:code, ds:data data segment message1 db 'Name of the file: $' message2 db 'Even linis: $' maxFileName db 12 lFileName db ? fileName db 12 dup

我是汇编新手,我的任务是读取文件名并打印此文件中的偶数行。我不知道如何找到一条新线路。我知道我必须去CMP13和CMP10,因为那是回车,但我没有成功。任何帮助都将不胜感激。以下是我目前掌握的情况:

assume cs:code, ds:data
data segment
message1 db 'Name of the file: $'
message2 db 'Even linis: $'
maxFileName db 12
lFileName db ?
fileName db 12 dup (?)
buffer db 8 dup (?), '$'
openErrorMsg db 'Open error!$'
readErrorMsg db 'Read error!$'
data ends

code segment    
start:

    mov ax, data
    mov ds, ax

    ;print initial message
    mov ah, 09h
    mov dx, offset message1
    int 21h

    ;read name of the file
    mov ah, 0ah
    mov dx, offset maxFileName
    int 21h

    ;convert name of the file to ASCIIZ
    mov al, lFileName
    xor ah, ah
    mov si, ax
    mov fileName[si], 0

    ;open file
    mov ah, 3dh
    mov al, 0
    mov dx, offset fileName
    int 21h

    jc openError ;error <=> CF=1
    mov bx, ax

    ;end of line
    mov dl, 10
    mov ah, 02h
    int 21h
    mov dl, 13
    mov ah, 02h
    int 21h

    ;print second message
    mov ah, 09h
    mov dx, offset message2
    int 21h

    ;end of line
    mov dl, 10
    mov ah, 02h
    int 21h
    mov dl, 13
    mov ah, 02h
    int 21h

    read:
        mov ah, 3fh
        mov dx, offset buffer
        mov cx, 8 ;read 8 char
        int 21h
        jc readError ;error <=> CF=1

        cmp buffer, 0Dh
        je read

        ;save bytes number and add $ for printing
        mov si, ax
        mov buffer[si], '$'     

    afisare:
        ;print what have we read
        mov ah, 09h
        int 21h
        cmp si, 8
        je read ;if we read 8 bytes, we have yet to read all

    jmp endPb ;nu exista erori

    openError:
        mov ah, 09h
        mov dx, offset openErrorMsg
        int 21h
        jmp endPb

    readError:
        mov ah, 09h
        mov dx, offset readErrorMsg
        int 21h 

    endPb:
        mov ax,4c00h
        int 21h

    mov ax,4c00h
    int 21h
code ends
end start
假设cs:code,ds:data
数据段
message1 db“文件名:$”
message2数据库“偶数linis:$”
maxFileName数据库12
lFileName数据库?
文件名db 12 dup(?)
缓冲区数据库8重复(?,“$”
openErrorMsg数据库“打开错误!$”
readErrorMsg数据库“读取错误!$”
数据端
代码段
开始:
mov-ax,数据
mov-ds,ax
;打印初始消息
mov啊,09h
mov dx,偏移量消息1
int 21h
;读取文件名
mov啊,0ah
mov dx,偏移量maxFileName
int 21h
;将文件名转换为ASCIIZ
mov al,lFileName
xor啊,啊
mov-si,ax
mov文件名[si],0
;打开文件
mov-ah,3dh
mov al,0
mov-dx,偏移文件名
int 21h
jc-openError;错误CF=1
mov-bx,ax
;行尾
mov dl,10
mov啊,02h
int 21h
mov dl,13
mov啊,02h
int 21h
;打印第二条消息
mov啊,09h
mov dx,偏移量信息2
int 21h
;行尾
mov dl,10
mov啊,02h
int 21h
mov dl,13
mov啊,02h
int 21h
阅读:
mov-ah,3fh
偏移缓冲器
mov-cx,8;读8个字符
int 21h
jc读取错误;错误CF=1
cmp缓冲区,0Dh
杰瑞德
;保存字节数并添加$以进行打印
mov-si,ax
mov缓冲区[si],“$”
阿费萨尔:
;打印我们读到的内容
mov啊,09h
int 21h
cmp si,8
杰雷德;如果我们读取8个字节,那么我们还没有读取所有字节
jmp-endPb;新埃罗里酒店
开场白错误:
mov啊,09h
mov dx,偏移开启箭头SG
int 21h
jmp-endPb
读取错误:
mov啊,09h
mov dx,偏移量读取错误消息
int 21h
endPb:
mov-ax,4c00h
int 21h
mov-ax,4c00h
int 21h
代码结束
结束-开始

问题在于你的
阅读
代码。我添加了一些评论,以便您更容易发现问题:

read:
    mov ah, 3fh              ; Read from file or device
    mov dx, offset buffer    ; Read destination
    mov cx, 8                ; Read 8 characters into buffer
    int 21h                  ; BIOS call
    jc readError             ; Check for error in carry flag

    ;;; vvv Here's your problem
    cmp buffer, 0Dh          ; Check to see if the memory address of
                             ; buffer is 0x0d
    ;;; ^^^ Here's your problem

    je read                  ; If the address is 0x0d, jump back and read again
如上所述,问题在于您将错误的内容与
0x0d
进行比较。您可能打算这样做:

    cmp [buffer], 0dh

虽然这将比较数据而不是
缓冲区的地址文本,但它仍然不完整。您确实想比较读取的每个字节,看看它是否包含ASCII 13。因为这是一项家庭作业,所以我把它留给你:)

嗯,我真的不知道那是干什么用的。这只是课堂上的东西。我只是想知道如何找到终点线。如果我们读取正确的文件名,那么现在的代码将打印文件的全部内容。