如果我用太大而不适合的值初始化 BYTE 或 SBYTE,会发生什么情况?

What happens if I initialize a BYTE or SBYTE with a value that is too large to fit?

我目前正在按照 Kip Irvine 的汇编语言书籍学习 x86 汇编语言。

作者在书中写道:

3.4.4 Defining BYTE and SBYTE Data

The BYTE (define byte) and SBYTE (define signed byte) directives allocate storage for one or more unsigned or signed values. Each initializer must fit into 8 bits of storage.

我只是想知道,如果我不小心为存储区分配了一个太大的值怎么办?我应该期待什么样的行为?

由于我经验不足,我无法想出一个示例来演示该行为,所以如果有人可以提供代码示例的解释,那就太好了。

假设您有一个标签 MyMemoryLocation,以及其他标签,并且您是这样写的:

.DATA 
Before           BYTE 0
MyMemoryLocation BYTE 0
After            BYTE 0

并且您有滥用标签并试图在 16 位操作中使用它的代码:

.CODE
MOV AX, 1234H
MOV MyMemoryLocation, AX

如果你没有得到汇编错误(MASM会给你"Operand size mismatch"),AX中的值将被写入从MyMemoryLocation开始的地址。

由于 80x86 是 little-endian,因此首先写入最低有效字节,即 MyMemoryLocation。第二个字节将在 After 处立即写入内存。所以你最终会得到:

Before            BYTE 0
MyMemoryLocation  BYTE 34H
After             BYTE 12H