.ascii和.string汇编程序指令之间的区别是什么?

时间:2016-04-26 02:00:01

标签: gcc assembly x86 directive gas

我知道.string指令不会在字符串的末尾添加空字符。 .asciz指令用于此目的。但是,我不知道.string指令是否在字符串的末尾放置一个空字符。如果是,那么.ascii.string指令之间的区别是什么?对我而言,"$files = array('http://xyz.xyz/contributor/sub/file/' . $data['zipname'] ); 似乎都是多余的。

1 个答案:

答案 0 :(得分:3)

只是这个问题不再显示在“未答复” ...

根据binutils docs

.ascii(供参考)

  

.ascii期望零个或多个字符串文字,以逗号分隔。它将每个字符串(不带自动尾随零字节)组合成连续的地址。

.asciz

  

.asciz与.ascii一样,但是每个字符串后跟一个零字节。 .asciz中的“ z”代表“零”。

.string

  

将str中的字符复制到目标文件。您可以指定要复制的多个字符串,以逗号分隔。除非为特定机器另外指定,否则汇编器会用0字节标记每个字符串的结尾。

     

...

     

变体string16,string32和string64与字符串伪操作码的不同之处在于,将str中的每个8位字符复制并分别扩展为16、32或64位。扩展的字符以目标字节顺序存储。

它们都支持转义序列并接受多个参数。至于您提到的两者之间的区别:

  • 在某些特定体系结构中,.string不会添加空字节,而.asciz总是会添加空字节。你可以这样做:
    • echo '.string""' | gcc -nostdlib -xassembler -; objdump -sj .text a
    • 如果第一个字节为00,则插入了空字符。
  • .string还具有后缀,可以将字符扩展到某些宽度(16、32或64)。

如对问题的评论中所述,在大多数情况下,除了语义上没有其他区别,但从技术上讲,这两个伪操作是不同的。

附录:

事实证明,文档 do 提到了两种行为不同的架构:

  • HPPA(HP精密体系结构)-不加0,但是为此添加了特殊的.stringz指令。
  • TI-C54X(得克萨斯仪器公司的某些DSP芯片)-每个字的高8位(2字节)为零。有一个相关的.pstring指令,用于包装字符并将未使用的空间零填充。

gas/config文件夹中浏览源代码,我们可以确认这一点并找到另外一个:

  • IA64(英特尔体系结构)-.string.stringz的行为类似于HPPA。