【问题标题】:Whats the difference between .asciiz vs .ascii.asciiz 与 .ascii 有什么区别
【发布时间】:2011-10-16 07:58:01
【问题描述】:

我读到 .asciiz null 终止了字符串(附加 \n?)...但是在查看 QtSPIM 的用户数据段时,

User data segment [10000000]..[10040000]
[10000000]..[1000ffff]  00000000
[10010000]    6c6c6548  6f57206f  00646c72  6c6c6548    H e l l o   W o r l d . H e l l 
[10010010]    6f57206f  00646c72  00000000  00000000    o   W o r l d . . . . . . . . . 
[10010020]..[1003ffff]  00000000

我看不出有什么不同?

.data
  str1: .asciiz "Hello World" # string str1 = "Hello World"
  str2: .ascii "Hello World" # string str2 = "Hello World"

.text
  .globl main
    main: 
      li $v0, 4 # print_string

      # print(str1)
      la $a0, str1 # load address of str1 into $a0
      syscall

      # print(str2)
      la $a0, str2 # load address of str2 into $a0
      syscall

      j $ra

输出“Hello WorldHello World

更新

它们的含义是什么?我什么时候使用它们? asciiz 听起来像是“正确”的方法?

【问题讨论】:

  • null 终止意味着添加 \0 - 具有 0 值的字节。 “.ascii”没有被宏处理器终止
  • 要查看差异,添加第 3 个 str: str2: .ascii "text" 并重新检查段的二进制转储。
  • 好的,那么问题是我什么时候使用它们?
  • 您阅读了您正在调用的例程的规范并传递输入以获得您想要的输出。

标签: mips


【解决方案1】:

正如@osgx 所写,ASCIIZ 表示字符串由\0(ASCII 代码0)NUL 字符终止。他们甚至被称为C strings。从那里引用:

在计算中,C 字符串是一个以 a 结尾的字符序列 空字符('\0',在 ASCII 中称为 NUL)。它通常存储为 一维字符数组。[可疑-讨论]名称指的是 使用此字符串表示的 C 编程语言。 替代名称是 ASCIIZ(请注意,C 字符串并不意味着使用 ASCII) 和以 null 结尾的字符串。

【讨论】:

  • @jiewmeng 我会一直使用 asciiz,除非你知道你不需要 0 终止符。操作系统系统调用通常在 unix 上接受 asciiz 字符串,因为 unix 是/曾经用 C 编写的。
  • @jiewmeng 对于缺失的差异:可能您的汇编程序正在尝试在 32/64 位边界上对齐字符串。因此,1 个字符的 ASCII(非 Z)字符串将被 3x \0 填充,使其成为 ASCIIZ 字符串。也许 4 或 8 个字符长的字符串不会显示这种行为。通常,您应该在 ASCII 字符串之后放置第三个字符串,以准确查看 ASCII 字符串的结束位置。否则,汇编器将简单地用\0 填充数据部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 2011-02-19
  • 2013-03-14
  • 2018-09-14
  • 2014-01-03
  • 2021-12-22
  • 2017-10-25
相关资源
最近更新 更多