Assembly 标签指令如何没有为其自身分配存储?

Assembly 标签指令如何没有为其自身分配存储?,assembly,masm,masm32,Assembly,Masm,Masm32,在kip irvine的《汇编语言》一书中,他谈到了标签指令,并说了以下声明 在下面的示例中,我们声明 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怎么能

在kip irvine的《汇编语言》一书中,他谈到了标签指令,并说了以下声明

在下面的示例中,我们声明 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存储在哪里


我对此感到困惑

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


使用标签还可以指定类型词。因此,在本例中,val16与val32重叠,实际上是指val32中dword的第一个单词。

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


使用标签还可以指定类型词。因此,在本例中,val16与val32重叠,实际上是指val32中dword的第一个单词。

将标签想象为您作为地址持有者使用的名称

初学者经常误解指令,因为他们无法区分指令和指令

指令被C和链接器中的汇编程序编译器用作一种速记符号或指令,用于生成CPU的最终指令集

在上面的例子中,如果你在代码Kip声明之前阅读了书中的最后一句话

标签的一个常见用途是提供一个可选的名称和大小 数据段中下一个声明的变量的属性。在 下面的示例中,我们在val32前面声明了一个名为val16的标签 并给它一个单词属性:

.data
val16 LABEL WORD
val32 DWORD 12345678h
.code
mov ax,val16 ; AX = 5678h
mov dx,[val16+2] ; DX = 1234h
我已经强调了你需要理解的文本的关键部分,注意对单词NEXT的强调。所以在数据段中,你有这样的东西

.data
val16 LABEL WORD
val32 DWORD 12345678h
组装程序时,MASM读取val16标签字并说

嘿,我可以在这一行看到指令标签,这意味着他想让我记住下一个变量的地址,在本例中是val32,他想给这个地址的别名是val16,val16的大小是WORD

在汇编和链接代码以生成最终可执行文件时,每当它看到val16时,它都会将其替换为Val32地址,因此您可以看到它不消耗任何存储空间

因此,您可以看到val16只不过是地址的别名,链接器只要在代码中遇到真实地址(例如在代码行中遇到),就用真实地址替换它 mov ax,上面第16页

以防任何新手都想知道为什么1234h没有被转移到AX中

Kip回答了上述示例前约2页的问题:

为什么1234h没有移动到AX?x86处理器使用little endian 低阶字节存储在变量存储区的存储格式 起始地址

以下是一张图片,可帮助您将其可视化:


把标签想象成一个你用来作为地址持有者的名字

初学者经常误解指令,因为他们无法区分指令和指令

指令被C和链接器中的汇编程序编译器用作一种速记符号或指令,用于生成CPU的最终指令集

在上面的例子中,如果你在代码Kip声明之前阅读了书中的最后一句话

标签的一个常见用途是提供一个可选的名称和大小 数据段中下一个声明的变量的属性。在 下面的示例中,我们在val32前面声明了一个名为val16的标签 并给它一个单词属性:

.data
val16 LABEL WORD
val32 DWORD 12345678h
.code
mov ax,val16 ; AX = 5678h
mov dx,[val16+2] ; DX = 1234h
我已经强调了你需要理解的文本的关键部分,注意对单词NEXT的强调。所以在数据段中,你有这样的东西

.data
val16 LABEL WORD
val32 DWORD 12345678h
组装程序时,MASM读取val16标签字并说

嘿,我可以在这一行看到指令标签,这意味着他想让我记住下一个变量的地址,在本例中是val32,他想给这个地址的别名是val16,val16的大小是WORD

在汇编和链接代码以生成最终可执行文件时,每当它看到val16时,它都会将其替换为Val32地址,因此您可以看到它不消耗任何存储空间

因此,您可以看到val16只不过是地址的别名,链接器只要在代码中遇到真实地址(例如在代码行中遇到),就用真实地址替换它 mov ax,上面第16页

以防任何新手都想知道为什么1234h没有被转移到AX中

Kip回答了上述示例前约2页的问题:

为什么1234h没有移动到AX?x86处理器使用little endian wh中的存储格式 ich低阶字节存储在变量的 起始地址

以下是一张图片,可帮助您将其可视化:


确切地说,它在汇编代码时会占用汇编程序中的存储空间,因为它需要记住它的含义。但是,最终生成的二进制文件只有一个可寻址值val32。换句话说,如果不覆盖val32中的内容,就无法在val16中存储任何内容。确切地说,它在汇编代码时会占用汇编程序中的存储空间,因为它需要记住它的含义。但是,最终生成的二进制文件只有一个可寻址值val32。换句话说,如果不覆盖val32中的内容,就无法在val16中存储任何内容。