我正在阅读 Richard C. 所著的《80x86 汇编语言和计算机体系结构导论》教科书。Detmer 在第 59 页上谈到了 字节 汇编语言中的指令并将其用于字符和字符串。正文如下:

“除了数字操作数之外, 字节 指令允许具有单个字符的字符操作数或具有多个字符的字符串操作数。撇号 (') 或引号 (") 可用于指定字符或分隔字符串。他们必须成对出现;您不能在左侧放置撇号,在右侧放置引号。用撇号分隔的字符串可以包含引号,而用引号分隔的字符串可以包含撇号,从而可以让字符串包含这些特殊字符。”

这是非常可以理解的,但我的好奇心是 字节 指令,因为我认为它只能容纳一个字节,八位。我做了一个测试,如果我说

string BYTE "HelloWorld"

它当然会编译,但如果您检查十六进制,您会发现它不仅仅是一个字节,而是多个字节。查看 ascii 表,我们已经知道单个字符是一个字节。那么我们怎样才能有字符串呢?我尝试将其应用到数字上。我们知道的范围 字节 指令是从-128到255。我尝试了这段代码:

number BYTE 9987

当我尝试编译和运行时,出现错误,因为 9987 比一个字节大。但为什么字符串不受此影响呢?为什么可以 字节 指令在字符串上下文中保存多个字节,但对数字不做同样的事情?

我想象当我编译并运行我列出的第一个代码语句时,它会出现与第二个代码语句相同的错误。为什么这里的“规则”被打破了呢?

-担

有帮助吗?

解决方案

请注意,没有单一的汇编语法,不同的程序可能使用不同的语法。您应该查阅汇编器手册。

也就是说,字符串常量通常只是每个字符的简写符号,并且 BYTE 指令允许一次定义多个项目。

所以,举例来说, BYTE 1, 2, 3, 4 有效并定义 4 个字节,并且您的 string BYTE "HelloWorld" 相当于 string BYTE 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd' 并定义10个字节。您没有收到错误的原因是因为每个字符本身都适合一个字节。

有些汇编器甚至不允许字符串文字 BYTE 或等效指令,它们有针对字符串的专门指令,例如 .string 或者 .ascii.

其他提示

BYTE 指令告诉汇编,以备一块的存储和记其长度在字节。长确定的字节的数目在初始化,这可能是之间的数字,0至255小数,或字的单一的报价。字符串中常见的编程语言,并且通常被认为是阵列中的字符连续字节中的存储器。为便利于程序的汇编可以让你保留一个字节的序列初始化为一个字符串通过指定的串在单一或双引号。这些都是等同

string1 BYTE 'H', 'e', 'l', 'l', 'o'

string1 BYTE 'Hello'

有些汇编有不同的指令对于这一点,例如Oracle Solaris x86大会语言都有一个

  • .byte 指令,只是字节
  • .ascii 指令,需要一串,不会NUL终止
  • .string 指令,采取一字符串 will 被NUL终止
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top