【发布时间】:2017-06-25 03:14:04
【问题描述】:
我目前正在按照 Kip Irvine 的“汇编语言 x86 编程”一书学习汇编编程。
在书中,作者试图解释data label的概念
数据标签标识变量的位置,提供 在代码中引用变量的便捷方式。以下,对于 例如,定义一个名为 count 的变量:
count DWORD 100汇编器 为每个标签分配一个数字地址。
所以我对data label所做的理解是:数据标签count是一个包含数值的变量,其中数值是内存中的一个位置。当我在代码中使用count 时,我实际上使用的是内存中该位置中包含的值,在本例中为 100。
我对数据标签的理解正确吗?如果它有些不正确,有人可以指出错误吗?
【问题讨论】:
-
数据标签是对保存数据的内存地址的引用(别名)。
count DWORD 100创建一个具有偏移量的标签,该偏移量最终会在程序运行时知道。count是标签。它最终会有一个地址。在该地址有一个 32 位值 (DWORD) 等于 100 -
在masm中可以使用
offset关键字获取count的地址。如果你有一个 32 位程序mov eax, offset count会将 count 的 32 位地址移动到 eax 中。mov eax, [count]会将 32 位值移动到与 EAX 中的计数相关联的地址。您还可以使用类似lea eax, [count]的方式获取带有LEA 的标签的地址。使用 LEA(加载有效地址),您无需使用offset关键字。 -
@Michael 由于我们这里的好队长发现您的 cmets 很有帮助,您应该考虑将他们提升为答案。如果我要发布自己的内容,我不确定我还会添加什么。老实说,Irvine 的解释似乎还不错;如果我编辑他的书,我不确定我会如何清除它。对于已经了解其他高级编程语言的人来说,将其称为“变量”可能会感到困惑,在这种情况下完全避免使用这个术语会更好吗?
-
OP: "在那个地址有一个 32 位值 (DWORD) 等于 100" .. 标签实际上指向那个 dword 的第一个字节。您可以使用它来访问任意数量的字节,例如新 asm 程序员的常见错误是为某些变量
count db 10 ; reserve+define 1 byte分配错误的内存量,然后覆盖更多内存mov [count],ebx ; writes 4 bytes。 MASM 是很少有的 x86 汇编器之一,它试图真正跟踪标签的“类型”,但它很少有帮助,其他汇编器也不这样做。所以不要依赖它,把标签记在心里。 -
为了更好地理解为什么这些细微的差异(标签与变量)很重要,您应该在组装特定源代码期间切换“列表”选项,并检查输出的机器代码以更好地了解哪些内存内容构成了计算机的代码。然后,您将认识到标签只是汇编符号,在编译和链接期间有效,但不是目标机器代码的一部分,即
mov eax,[count]不会首先获取一些count标签变量,但具有直接编码的正确内存地址指令操作码,即mov eax,[<some 32bit number as address>].