如果我用太大而不适合的值初始化 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
我目前正在按照 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