Assembly 为什么程序集中字符串变量的末尾包含0?

Assembly 为什么程序集中字符串变量的末尾包含0?,assembly,x86,masm,c-strings,Assembly,X86,Masm,C Strings,这是在程序集中声明byte类型变量的正常方法: msg0 BYTE "string_1 in upper case: ",0 需要手动指定什么,0?它可能标志着字符串的结束 但是,一旦我们关闭双引号,字符串的结尾不是很明显吗?没有用右引号附加的隐式终止零,因为您并不总是希望这样。e、 g.要传递给采用长度的write系统调用,您只需要ASCII字节和长度(显式长度字符串),而不是隐式长度以0结尾的C字符串 e、 g 或者作为结构或其他内容的一部分,有效地定义一个固定宽度ch

这是在程序集中声明byte类型变量的正常方法:

msg0 BYTE "string_1 in upper case: ",0
需要手动指定什么
,0
?它可能标志着字符串的结束


但是,一旦我们关闭双引号,字符串的结尾不是很明显吗?

没有用右引号附加的隐式终止零,因为您并不总是希望这样。e、 g.要传递给采用长度的
write
系统调用,您只需要ASCII字节和长度(显式长度字符串),而不是隐式长度以0结尾的C字符串

e、 g


或者作为结构或其他内容的一部分,有效地定义一个固定宽度
char buf[4]
或所有使用都占用全部4个字节的内容,而不是搜索终止的0。

引号不是字符串的一部分,它们不会在内存中。零字节将为。请注意,并非所有字符串都需要以零结尾,这也是汇编程序不自动添加零的原因之一。一些汇编器对以零结尾的字符串有特殊指令,例如gnu汇编器有
.string
.asciz
,它们会为您添加零,而无需键入。双引号在内存中不存在。此字符串的内存布局
“FOO”,0
将是
F,O,O,\0
0
不是为您准备的,它是为使用字符串来知道字符串何时结束的函数准备的。@rohitsharma好吧,也许有些函数希望另一个字节表示字符串的结束,但我从未见过这样的情况<代码>0几乎总是被使用。请注意(我认为)在DOS中,字符串以
$
结尾,但这是我所知道的唯一例外情况。@mediocrevegetable1:DOS中断21h服务09h使用以美元符号结尾的字符串。它在Hello World类型的程序中很流行,因为它是DOS提供的最简单的字符串输出函数。(另一种选择是使用服务40h,
bx
=1(标准输出),
cx
=length,
ds:dx
->-string。)我相信这是CP/M的保留。@Rohitharma我相信你是对的。引号只是用于指定每个特定字符的简短形式。要在引号中包含0,您的汇编器可能必须支持转义字符(例如,NASM允许使用反勾选字符串文字。您似乎在使用来自
字节的MASM/TASM,但我对此不太了解)。或者正如Jester所说,像GAS这样的汇编器会对以0结尾的字符串有特定的指令。这个问题和我发布的有点不同。但我正在寻找一个不同于Microsoft visual studio的IDE。有什么建议吗?vscode怎么样?@rohitharma:我在GNU/Linux上使用emacs(或者有时使用vim进行快速编辑)+命令行。对我来说效果很好(特别是在小型测试程序/微基准上运行
perf stat
),从来没有为任何臃肿的IDE而烦恼过,特别是在几年前,当时RAM比我现在的计算机更紧。是的,Intel和AMD都有PDF手册。有很多英特尔的HTML片段,比如。在上,您可以看到有带有
mov-reg,r/m
mov-r/m,reg
mov-r/m,immediate
的表单。当然,它没有关于寻址模式语法的示例或任何特定于汇编程序的详细信息,因为这是ISA文档(用于机器代码/操作码),而语法详细信息取决于用于创建所需机器代码的工具(汇编程序)。这是MOV的
MOV r/m8,imm8
形式(本例中使用m8内存操作数).我告诉过你,它不会详细介绍寻址模式的特定于汇编程序的语法等,当然也不会为每条指令的操作数枚举所有可能的选项,这将花费很长时间。它告诉你目标可以是一个r/m模式,因此告诉你它可以是任何允许的,ib可以是一个ny 8位常量。您是否还需要类似的内容?当然,英特尔的PDF手册会对所有这些组件进行描述,但会与每个指令分开。请参阅中的介绍章节和附录。
msg  db "hello"
msglen = $ - msg