File 我的asm代码在使用int 21h函数时写入垃圾字节
我对堆栈溢出进行了搜索,没有发现任何类似于我的问题。我的问题是:我有一个代码可以打开一个文件并在最后写一条消息。当我第一次使用int 21h写入文件时,如果文件是空的,它写得很好,但是如果文件有内容,程序会在末尾添加许多垃圾字节(如畂 或其他日文或中文字符) 我已检查程序写入的字节数是否不超过消息长度。请帮帮我。以下是我的源代码:File 我的asm代码在使用int 21h函数时写入垃圾字节,file,assembly,character-encoding,dos,tasm,File,Assembly,Character Encoding,Dos,Tasm,我对堆栈溢出进行了搜索,没有发现任何类似于我的问题。我的问题是:我有一个代码可以打开一个文件并在最后写一条消息。当我第一次使用int 21h写入文件时,如果文件是空的,它写得很好,但是如果文件有内容,程序会在末尾添加许多垃圾字节(如畂 或其他日文或中文字符) 我已检查程序写入的字节数是否不超过消息长度。请帮帮我。以下是我的源代码: .model tiny .code main: call delta delta: pop bp
.model tiny
.code
main:
call delta
delta:
pop bp
sub bp, offset delta
mov ax, @code ;Get the address of code segment and store it in ax
mov ds, ax ;Put that value in Data segment pointer.
;Now, we can reference any data stored in the code segment
;without fail.
;Subroutines
open:
mov ax, 3D02H ;Opens a file
lea dx, [bp+filename];Filename
int 21h ;Call DOS interrupt
mov handle, ax ;Save the handle in variable
move_pointer_to_end:
mov bx, handle
mov ax,4202h ; Move file pointer
xor cx,cx ; to end of file
cwd ; xor dx,dx
int 21h
write:
mov ax, 4000H
mov bx, handle
lea dx, [bp+sign]
mov cx, 16
int 21H
exit:
mov ah,4Ch ;Terminate process
mov al,0 ;Return code
int 21h
datazone:
handle dw ?
filename db 'C:\A.txt', 0
sign db 'Bush was here!!', 0
end main
请帮帮我 这是因为添加数据的文件是用unicode编码的。如果您从记事本或其他文本编辑器写入文件并保存,则必须选择ANSI作为编码。然后,如果将程序指向ANSI编码的文本文件,它应该附加预期结果所指示的字符串
Unicode为每个字符分配两个字节,因此在十六进制编辑器中您可能会看到
s.o.m.e.t.h.i.n.g。l、 i.k.e..t.h.i.s.
而不是ANSI或UTF-8所期望的类似的的东西。您是否在十六进制编辑器中查看了输出?我感觉您正在将utf-8或iso-8859-1格式的原始ASCI附加到unicode格式的文件中。您必须在退出程序之前关闭该文件。谢谢您的回答。我用集成在代码块中的十六进制编辑器检查了该文件。在代码块十六进制编辑器中,我可以看到字符串。但当我用记事本打开它时,我只能看到汉字。为什么???记住int 21h的函数4Ch已经关闭了所有打开的文件句柄。但是他们的错误是使用函数42h(LSEEK)移动文件指针。谢谢您的回答,@JustKevin@jhonny6721您可以通过检查文件是否以@xmojmr开头来自动检测记事本保存的文件格式谢谢您的帮助。