我无法打印"我赢了!"到文件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
答案 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)。