今天,在声明常量字符串时(在win 10中使用Visual Studio社区2015),我遇到了一个问题。 书说,
String BYTE "HELLO",0
当我输入相同内容时,MASM会抛出如下错误:
语法错误:,
然后,我删除了,然后0显示:
表达式中缺少运算符
如何消除此错误? 声明常量字符串的正确方法是什么?
答案 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
AL
寄存器的大小相同)DW
( D eclare W ord),相当于 WORD
AX
寄存器的大小相同)DD
( D eclare D oubleWord),相当于 DWORD
EAX
寄存器的大小相同)DF
( D eclare F loat),相当于 FWORD
DQ
( D eclare Q uadWord),相当于 QWORD
RAX
寄存器的大小相同,并且还用于存储双精度浮点值)DT
( D eclare T en-byte),相当于 TBYTE
强> 答案 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,而不仅仅是字符串。