在汇编中将字符串写入文件100次

时间:2015-04-10 19:25:31

标签: assembly x86-16

我无法打印"我赢了!"到文件100次。我可以把它打印出来,但它打印出来的乱码可以有人请指出我做错了吗?我需要打印代码而不会出现任何问题"我赢了!"一个接一个。

.model small
.stack 100h
.data
    handle      dw ? 
    filename    db "myfile.txt", 0
    prompt1 db "ENTER FILE NAME HERE: $" 
    mess1       db ' I WIN! $'

.code
    main:           
        mov ax, @data       ; set up addressability of data
        mov ds, ax

        lea dx, prompt1            ; load and print the string PROMPT
        mov ah, 9
        int 21h

        mov ah, 3ch         ; dos service to create file
        mov cx, 0
        mov dx, offset filename
        int 21h

        jc failed                           ; end program if failed

        mov handle, ax                      ; save file handle

        mov cx, 100                         ; number of bytes to write
    PL:
        mov ah, 40h                         ; write to 
        mov bx, handle                      ; file
        mov dx, offset mess1                ; where to find data to write
        dec cx
        int 21h
        jnz PL

        mov ah, 3Eh                         ; close file
        mov bx, handle                      ; which file
        int 21h

    failed:

        mov ah, 4ch
        int 21h
    end main

1 个答案:

答案 0 :(得分:2)

问题是要写入文件的代码块需要CX中字符串的长度,并且您已经使用CX作为循环计数器,因此,我修复了代码以使用DI而不是CX,就像这样:

    .model small

    .stack 100h

    .data

    handle      dw ? 

    filename    db  26        ;MAX NUMBER OF CHARACTERS ALLOWED (25).
                db  ?         ;LENGTH (NUMBER OF CHARACTERS ENTERED BY USER).
                db  26 dup(0) ;CHARACTERS ENTERED BY USER. END WITH CHR(13).

    prompt1 db "ENTER FILE NAME HERE: $" 

    mess1       db ' I WIN! $'

    .code

    main:           
    mov ax, @data       ; set up addressability of data
    mov ds, ax

;DISPLAY MESSAGE.
    lea dx, prompt1            ; load and print the string PROMPT
    mov ah, 9
    int 21h      

;CAPTURE FILENAME FROM KEYBOARD.                                    
    mov ah, 0Ah
    mov dx, offset filename ;THIS VARIABLE REQUIRES THE 3-DB FORMAT.
    int 21h                

;CAPTURED STRING ENDS WITH CHR(13), BUT TO CREATE FILE WE NEED
;THE FILENAME TO END WITH CHR(0), SO LET'S CHANGE IT.
    mov si, offset filename + 1 ;NUMBER OF CHARACTERS ENTERED.
    mov cl, [ si ] ;MOVE LENGTH TO CL.
    mov ch, 0      ;CLEAR CH TO USE CX. 
    inc cx         ;TO REACH CHR(13).
    add si, cx     ;NOW SI POINTS TO CHR(13).
    mov al, 0
    mov [ si ], al ;REPLACE CHR(13) BY 0.            

;CREATE FILE.
    mov ah, 3ch         ; dos service to create file
    mov cx, 0
    mov dx, offset filename + 2 ;CHARACTERS START AT BYTE 2.
    int 21h

    jc failed                           ; end program if failed

    mov handle, ax                      ; save file handle

    mov DI, 100 ;CAN'T USE CX BECAUSE WE NEED IT TO WRITE TO FILE.
    PL:
;WRITE STRING ON FILE.
    mov ah, 40h                         ; write to 
    mov bx, handle                      ; file
    mov dx, offset mess1                ; where to find data to write
    mov cx, 7 ;LENGTH OF STRING IN CX.
    int 21h

    DEC DI ;DECREASE COUNTER.
    jnz PL

    mov ah, 3Eh                         ; close file
    mov bx, handle                      ; which file
    int 21h

    failed:

    mov ah, 4ch
    int 21h

    end main

我编辑了代码以从键盘捕获文件名。说明:要从键盘捕获字符串,我们使用服务0AH,这需要一个3-DB格式的变量:一个DB允许最大字符数(加1),另一个DB表示长度,第三个DB表示字符他们自己。如果我们想要捕获25必须指定26,因为捕获以chr(13)结束。

要创建文件,文件名必须以chr(0)结尾,因此我们必须找到chr(13)并将其替换为chr(0)。