ASCIIZ字符串以零字节

时间:2015-05-11 16:20:20

标签: string assembly x86 dos

我正在编写一个程序集级程序来创建一个文件。

.model small
.data
 Fn db "test" 
.code
mov ax,@data 
mov ds,ax

mov CX,00
lea DX,Fn

mov ah,3ch
int 21h

Mov ah,4ch
Into 21h
End

虽然程序没有错误,但是文件没有创建,所以我搜索了互联网以获取原因。

然后我找到了ASCIIZ。

所以我用

替换了数据段
.data
Fn db "test", 0 

有效。

为什么我们需要使用ASCIIZ?为什么不能使用普通字符串来创建文件?

1 个答案:

答案 0 :(得分:3)

我们假设您的.data部分有多个字符串:

Fn db "test" 
s1 db "aaa"
s2 db "bbb"

当你编译它时,.data部分将包含所有3个字符串,一个接一个:

0x74 0x65 0x73 0x74 0x61 0x61 0x61 0x62 0x62 0x62

testaaabbb的二进制表示。

必须有一种方法让函数找出第一个字符串结束和第二个字符串开始的位置。这个"标记"是0x00字节(" \ x00"),这也称为"空字节终止字符串"或ASCIIZ,这样你就可以知道字符串的结束位置:

Fn db "test",0
s1 db "aaa",0x00 ; is the same
s2 db "bbb\x00" ; still same thing

现在,您的.data部分将如下所示

0x74 0x65 0x73 0x74 0x00 0x61 0x61 0x61 0x00 0x62 0x62 0x62 0x00

这是test\x00aaa\x00bbb\x00,现在你在字符串之间有一个分隔符,所以当你把一个字符串的起始地址提供给一个函数时,它会知道你的字符串到底在哪里。

相关问题