Assembly 写入程序集中的文件

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

我的任务是将缓冲区和其他一些文本打印到一个文件中,当我使用这段代码时,我得到了一个错误的答案。输出一个缓冲区是可以的,它可以完美地打印,但当我试图打印文本时,在数据中声明,非感官开始发生。例如,当我试图打印“Hello(letters)”,它会给我这个“Hello(9个空格)(letters$)$”。当我为每个字符串编写3个不同的过程时,它会正确打印。也许你们能帮我找到问题,伙计们

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)。谢谢,我会记住这一点。你太棒了,伙计!:)