Assembly 写入程序集中的文件
我的任务是将缓冲区和其他一些文本打印到一个文件中,当我使用这段代码时,我得到了一个错误的答案。输出一个缓冲区是可以的,它可以完美地打印,但当我试图打印文本时,在数据中声明,非感官开始发生。例如,当我试图打印“Hello(letters)”,它会给我这个“Hello(9个空格)(letters$)$”。当我为每个字符串编写3个不同的过程时,它会正确打印。也许你们能帮我找到问题,伙计们Assembly 写入程序集中的文件,assembly,file-io,buffer,dos,emu8086,Assembly,File Io,Buffer,Dos,Emu8086,我的任务是将缓冲区和其他一些文本打印到一个文件中,当我使用这段代码时,我得到了一个错误的答案。输出一个缓冲区是可以的,它可以完美地打印,但当我试图打印文本时,在数据中声明,非感官开始发生。例如,当我试图打印“Hello(letters)”,它会给我这个“Hello(9个空格)(letters$)$”。当我为每个字符串编写3个不同的过程时,它会正确打印。也许你们能帮我找到问题,伙计们 model small BufSize EQU 60 .stack 100h .data rez db
model small
BufSize EQU 60
.stack 100h
.data
rez db "rez.txt",
Buf db BufSize dup (?)
handle dw ?
Letters db 0
brackets1 db " (letters$"
brackets2 db ")$"
.code
start:
MOV ax, @data
MOV ds, ax
MOV ah, 3Ch
MOV cx, 0
MOV dx, offset rez
INT 21h ;results file is created and opened
MOV handle, ax
MOV cx, 5 ;5 bytes ("Hello")
ADD cx,10 ;10 bytes from "(letters " and ")"
MOV bx, handle
CALL Write
MOV ah, 3Eh
MOV bx, handle
INT 21h ;close file
MOV ah, 4Ch
MOV al, 0
INT 21h
PROC Write
PUSH dx
MOV ah, 40h
MOV dx, offset Buf
INT 21h ;Write to file
MOV ah,40h
MOV dx,offset brackets1
INT 21h
MOV ah,40h
MOV dx,offset brackets2
INT 21h
POP dx
RET
RasykBuf ENDP
END start
我添加了一些遗漏的说明和新的注释;我已经纠正了一个编译错误:
RasycBuf ENDP
(写入过程的名称不是吗?)。无论何时执行I/O操作,都必须检查是否成功完成,否则下一个I/O操作可能会生成运行时错误。
我已经成功编译了这个源代码。
但是我不知道你想要它做什么,因为正如另一个用户所说,这个程序是不完整的
model small
BufSize EQU 60
.stack 100h
.data
rez db "rez.txt", 0 ; NULL TERMINATOR WAS OMIT.
Buf db BufSize dup (32) ; CHARACTERS WITHOUT A PURPOSE (SPACES).
;handle dw ? ; NOT NEEDED.
;Letters db 0 ; NOT USED.
brackets1 db " (letters$"
brackets2 db ")$"
.code
start:
MOV ax, @data
MOV ds, ax
MOV ah, 3Ch
MOV cx, 0
MOV dx, offset rez
; AH -> 3CH, CREATE A FILE WITH HANDLE.
; CX -> Attribute for file:
; Bit0: read-only.
; Bit1: hidden.
; Bit2: system.
; Bit3: volume-label.
; Bit4: directory.
; Bit5: archive.
; Bit6: UNKNOWN.
; Bit7: shareable.
; DS:DX -> ASCIZ file-name (with optional drive and path).
; OUTPUT -> FCarry=1: ERROR, AX= error-code;
; FCarry=0: SUCCESSFULL, AX= file-handle.
INT 21h ; Results file is created and opened.
JB openfailed ; If error, exit.
;MOV handle, ax ; Not needed.
;MOV cx, 5 ; 5 bytes ("Hello")
;ADD cx, 10 ; 10 bytes from "(letters " and ")"
MOV bx, ax ; Copy file-handle into BX's reg.
CALL Write
MOV ah, 3Eh
;MOV bx, handle ; BX's reg. already contains handle.
; AH -> 3EH, CLOSE A FILE WITH HANDLE.
; BX -> File-handle
; OUTPUT -> FCarry=1: ERROR, AX= error-code;
; FCarry=0: SUCCESSFULL.
INT 21h ; Close file
openfailed:
MOV ah, 4Ch
MOV al, 0
; AH -> 4CH, QUIT WITH EXIT CODE (EXIT).
; AL -> EXIT CODE.
INT 21h
Write:
; I suppose that you want to write the content of the buffer (Buf),
; followed by brackets1 and brackets2 strings.
; NOTE: Buf CONTAINS ONLY CHARACTERS WITHOUT A PURPOSE !
;PUSH dx ; Because DX's reg. is only used here, don't need to PUSH/POP it
MOV ah, 40h
MOV cx, BufSize ; Size of Buf
MOV dx, offset Buf
; AH -> 40H, WRITE TO FILE WITH HANDLE
; BX -> Handle
; CX -> Buffer's size
; DS:DX -> Buffer
; OUTPUT -> FCarry=1: ERROR, AX= error-code;
; FCarry=0: SUCCESSFULL, AX= num. of byte written.
INT 21h ; Write to file
JB error ; If error, return
MOV ah, 40h
MOV cx, 10 ; Size of brackets1's string
MOV dx, offset brackets1
; AH -> 40H, WRITE TO FILE WITH HANDLE
; BX -> Handle
; CX -> Buffer's size
; DS:DX -> Buffer
; OUTPUT -> FCarry=1: ERROR, AX= error-code;
; FCarry=0: SUCCESSFULL, AX= num. of byte written.
INT 21h
JB error ; If error, return
MOV ah, 40h
MOV cx, 2 ; Size of brackets2's string
MOV dx, offset brackets2
; AH -> 40H, WRITE TO FILE WITH HANDLE
; BX -> Handle
; CX -> Buffer's size
; DS:DX -> Buffer
; OUTPUT -> FCarry=1: ERROR, AX= error-code;
; FCarry=0: SUCCESSFULL, AX= num. of byte written.
INT 21h
error:
;POP dx ; Because DX's reg. is only used here, don't need to PUSH/POP it
RET
END start
MOV-cx,ax;ax-5字节(“Hello”)
这应该做什么?您意识到ax包含文件句柄,对吗?将10
添加到这上面毫无意义?另外,Write
中的括号1/2
没有指定长度。此外,Buf
是未初始化的,不知道为什么您认为它会打印Hello
。这不是我的全部代码,我正在从文件中读取,buff很好。就凭那张照片。。。我已经编辑过了。所以你说我不应该在需要打印的字节数中添加任何内容?你的写入操作仍然像我说的那样被破坏,如果这不是你实际使用的代码,那只是误导和浪费我们的时间。看,从我的语言中翻译出来要花很长时间。最主要的是写东西,所以我找不出有什么不对。这意味着他们没有指定长度。我是汇编语言的新手。汇编语言或其他语言中有3个write()
(我指的是INT21/40)调用,每个调用都需要自己的指针和长度。您只更改指针,但使用相同的长度(显然是每次写入的总字节数)。听起来不对,但很难说。。。如果您不方便,我们非常抱歉,但是我们正在努力帮助您,所以您应该更主动一点。谢谢您!我所需要的是,我应该在每次打印时声明我的cx,而不是将它们全部添加并发送到过程。如果出现错误,我将添加跳转。非常感谢。我的程序必须从2个文件中输入文本,然后我必须插入前面的符号而不是空格,并计算文本中的空格数。很抱歉打扰了您的非完整程序。我必须快点,而且我无法将我所有的代码从国家语言翻译成英语。不客气。如果您不需要非常大的字符串,例如,如果您以标题字符串(Pascal格式)存储每行文本,它们最多可以包含255个字符,那么您可以编写一个在需要保存数据块时调用的唯一例程,而无需每次都设置CX
寄存器(+其他寄存器为AH
)每一次。传递的参数是DX
中的字符串地址(字符串的长度从其中的第一个字节开始计算,但必须在INT 21H
之前将DX
增加1)。谢谢,我会记住这一点。你太棒了,伙计!:)