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

Vas*_*th 3 x86 assembly masm

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

String BYTE "HELLO",0
Run Code Online (Sandbox Code Playgroud)

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

语法错误:,

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

表达式中缺少运算符

我怎样才能消除这个错误?声明常量字符串的正确方法是什么?

Cod*_*ray 7

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

VarName DB "String Contents",0
Run Code Online (Sandbox Code Playgroud)

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

我将其称为 MASM 的“标准”语法,因为它是我使用的一种,大多数编译器/反汇编器使用的一种,并且您会看到大多数代码示例都是用它编写的。

但是,正如Ped7g 在评论中指出的那样,现代版本的 MASM 实际上支持BYTE在声明中使用该指令。它实际上是 的同义词DB。这将使本书作者的代码正确,并适合与任何现代版本的 Visual Studio 捆绑的 MASM 版本一起使用:

VarName BYTE "String Contents",0
Run Code Online (Sandbox Code Playgroud)

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


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

  • DBd eclareYTE),其等同于 (一个8位的值相同大小的寄存器)BYTE
    AL
  • DWd eclare W¯¯ ORD),其等同于 (一个16位的值相同大小的寄存器)WORD
    AX
  • DDd eclare d oubleWord),其等同于 (一个32位的值相同大小的寄存器)DWORD
    EAX
  • DFd eclare ˚F高高飞翔),其等同于 (一个48位值用于存储单精度浮点值)FWORD
  • DQd eclare Q uadWord),其等同于 (一个64位的值相同大小的靶向64位模式下的x86-64时,并且还用于存储双精度浮点值寄存器)QWORD
    RAX
  • DTd eclare Ť烯字节),其等同于 (一个80位的值相同的尺寸的x87 FPU的基于堆栈的寄存器;用于将值溢出直接从那里到存储器,而不会失去精度)TBYTE

  • 您有 DB 代表 *Declare* Byte 的引用吗?我认为它代表“数据字节”;其目的是将字节直接组装到输出文件中。 (2认同)