在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存储在哪里?
我对此感到困惑?
答案 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处理器使用小端 存储格式,其中低位字节存储在变量的位置 起始地址
这是一张帮助您想象它的图片:
答案 1 :(得分:1)
标签只是创建一个符号名称。它使用与以下声明相同的存储空间。
使用标签,您还可以指定类型(单词)。所以在这种情况下,val16与val32重叠,实际上是指val32中dword的第一个单词。