0

I'm new to assembly and my task is to read a file's name and print the even lines from this file. I don't know how to find a new line. I understand I have to cmp 13 and 10 because that's the carriage return, but I was unsuccessfully. Any help will be appreciated. Here's what I have so far:

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
Michael Petch
  • 46,082
  • 8
  • 107
  • 198
  • Well, I am not really sure what that does. It's just something from the class. I would just like to know how to find the end line. The code right now is printing the whole content of the file if we read correct the name of the file. – RiseAgainst03 Dec 14 '15 at 06:49

1 Answers1

2

The trouble is in your read code. I've added comments to make it easier for you to see what's wrong:

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

As highlighted above, the trouble is that you are comparing the wrong thing to 0x0d. You likely meant to do this:

    cmp [buffer], 0dh

While this would compare data rather than the address literal of buffer, it still isn't complete. You really want to compare each byte that was read to see if it contains an ASCII 13. I'll leave that to you since it's a homework assignment :)

David Hoelzer
  • 15,862
  • 4
  • 48
  • 67