Assembly 寻找新线
我是汇编新手,我的任务是读取文件名并打印此文件中的偶数行。我不知道如何找到一条新线路。我知道我必须去CMP13和CMP10,因为那是回车,但我没有成功。任何帮助都将不胜感激。以下是我目前掌握的情况: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
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。因为这是一项家庭作业,所以我把它留给你:)嗯,我真的不知道那是干什么用的。这只是课堂上的东西。我只是想知道如何找到终点线。如果我们读取正确的文件名,那么现在的代码将打印文件的全部内容。