LABEL指令如何没有分配给自己的存储?

时间:2014-03-08 19:22:19

标签: assembly masm masm32

在kip irvine的书汇编语言中,他谈到了LABEL指令,并说了以下陈述

“” 在以下示例中,我们声明 val32之前的一个标签,名为val16,并赋予它一个WORD属性:

.data
val16 LABEL WORD
val32 DWORD 12345678h
.code
mov ax,val16 ; AX = 5678h
mov dx,[val16+2] ; DX = 1234h

val16是与val32相同存储位置的别名。 LABEL指令本身不分配存储空间。 “”

我的问题是val16如何与val32相同? val16存储在哪里?

我对此感到困惑?

2 个答案:

答案 0 :(得分:2)

将标签视为您用作地址持有者的名称。

初学者经常误解指令,因为他们未能区分指令和指令。

指令由汇编程序(或C中的编译程序)和链接程序用作一种“简写符号或指令”,用于为CPU生成最终的指令集。

在上面的例子中,如果您阅读了书中的最后一句(在代码之前)Kip陈述

  

LABEL的一个常见用途是提供替代名称和大小   数据段中声明为 next 的变量的属性。在里面   下面的例子,我们在名为val16的val32之前声明一个标签   并给它一个WORD属性:

我突出了你需要理解的文本的关键位(请注意对NEXT这个词的强调)。所以在数据段中你有这样的东西

.data
val16 LABEL WORD
val32 DWORD 12345678h

当您组装程序时,MASM读取“val16 LABEL WORD”并说

“嘿,我可以在这一行看到指令”LABEL“,这意味着他希望我记住要声明的 NEXT 变量的地址(在本例中为val32)和别名他想给这个地址我要记住的是val16,而val16的大小是WORD“

在汇编和链接代码以生成最终可执行文件时,只要它看到val16,它就会用Val32的地址替换它,所以你会发现它不会占用任何存储空间。

所以你看到val16只不过是一个地址的别名,而链接器只要在代码中遇到它就会用真实地址替换它,例如在你的代码行中 mov ax,val16以上。

以防万一新手想知道为什么1234h没有进入AX​​ ......

Kip在上面的例子之前回答了大约2页:

  

为什么1234h没有进入AX​​? x86处理器使用小端   存储格式,其中低位字节存储在变量的位置   起始地址

这是一张帮助您想象它的图片:

LABELS in colour!

答案 1 :(得分:1)

标签只是创建一个符号名称。它使用与以下声明相同的存储空间。

使用标签,您还可以指定类型(单词)。所以在这种情况下,val16与val32重叠,实际上是指val32中dword的第一个单词。