x86汇编语言中的常量字符串声明

时间:2017-01-05 15:51:14

标签: assembly x86 masm

今天,在声明常量字符串时(在win 10中使用Visual Studio社区2015),我遇到了一个问题。 书说,

String BYTE "HELLO",0

当我输入相同内容时,MASM会抛出如下错误:

  

语法错误:,

然后,我删除了,然后0显示:

  

表达式中缺少运算符

如何消除此错误? 声明常量字符串的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

用于声明常量字符串的“标准”MASM语法是:

VarName DB "String Contents",0

这声明了一个字节数组(db == d eclare b yte),其符号名称为VarName。该数组的内容由引号("String Contents")括起来的值给出,数组以NUL字符(0)结束。显然,这给你的是一个标准的C风格的NUL终止字符串,几乎可以用于任何C API。

我将其称为MASM的“标准”语法,因为它是我使用的语法,大多数编译器/反汇编程序使用的语法,以及您将看到的大多数代码示例都使用的语法。

但是,作为Ped7g points out in a comment,现代版本的MASM实际上支持在声明中使用BYTE指令。它实际上是DB的同义词。这将使本书作者的代码正确,并适用于与任何现代版本的Visual Studio捆绑在一起的MASM版本:

VarName BYTE "String Contents",0

您可以使用任何一种。如果您从使用后者的书中学习,您可能希望坚持使用它以方便使用。但是,你也应该注意前者,因为正如我所提到的,你会在整个地方看到它。

以下是您将在数据定义中看到的类型说明符(关键字)的完整列表:

  • DB D eclare B yte),相当于 BYTE
    8位值与AL寄存器的大小相同)
  • DW D eclare W ord),相当于 WORD
    16位值与AX寄存器的大小相同)
  • DD D eclare D oubleWord),相当于 DWORD
    32位值与EAX寄存器的大小相同)
  • DF D eclare F loat),相当于 FWORD
    (用于存储单精度浮点值的 48位值)
  • DQ D eclare Q uadWord),相当于 QWORD
    (当针对64位模式x86-64时, 64位值与RAX寄存器的大小相同,并且还用于存储双精度浮点值)
  • DT D eclare T en-byte),相当于 TBYTE
    80位值与x87 FPU基于堆栈的寄存器大小相同;用于将值从那里直接溢出到内存而不会丢失精度)

答案 1 :(得分:-2)

好的,有几种方法可以在MASM中声明字符串: 首先,您可以在数据段中声明字符串,并在整个代码中使用变量。

stringName    BYTE   "Hello, this is a string", 0 

要声明字符串常量,可以使用EQU或TEXTEQU指令。两者都在全局范围的数据段之前声明。

constantString  EQU      <"Hello, string content", 0>

棘手的部分是您需要在数据段中声明一个具有常量值的变量。像这样:

.data
variableName    BYTE    constantString

然后,您可以在其余的代码中继续使用您的命名变量。

TEXTEQU可能会比较棘手。它创建一个“文本宏”。它可以简单地分配文本,分配另一个现有文本宏的内容或const整数表达式。例如,这是文本。同样,必须将常量分配给数据段中的变量。

constantName    TEXTEQU    <"string content">

.data
variableName    BYTE   constantName

希望这会有所帮助。注意:字符串末尾的零字节对于字符串声明很重要,但是在TEXTEQU中,您定义的是MACRO,而不仅仅是字符串。