2017-10-08 112 views
3

我正在使用Visual Studio 2017,并且想要测试$符号。使用下面的代码,我期望var1和var2的值是不同的,但它们是相同的。

.data 
var1 DWORD $ 
var3 BYTE 16 dup (0FFh) 
var2 DWORD $ 

这是一个什么样VS显示内存

what VS shows in memory

的图像VAR1值对我来说很有意义,但是如果$应该显示下一个内存地址,为什么VAR2显示与var1相同的?它不应该显示004068A4吗?

回答

3
.data 
var1 DWORD $ 
var3 BYTE 16 dup (0FFh) 
var2 DWORD $ 

,你不会看到任何区别,因为特殊$编译时符号代表了代码(.CODE)程序的当前位置。

这里您使用它在.data部分有一个单独的地址空间。

+1

在NASM中,'section .data' /'var1 dd $'/ ... /'var2 dd $'* does *汇编到包含自己地址的每个双字。 NASM和MASM还有另一个“有趣”的区别。 (NASM的行为可以让你做'msglen equ $ - msg'这样的东西,在MASM中,你需要在字符串的末尾加上一个标签,并使用'msg_end - msg'?)我认为NASM行为更有用并没有那么令人惊讶,除非我缺少一个用例。 –

+0

根据我的理解,使用等号指令(=)是可行的,因为$最终放置在.code段而不是.data段。然而,我不明白'ListSize =($ - list)'是如何工作的,假设list只是一个字节数组的标识符。难道这与减去一些.data偏移量的.code偏移量是一回事吗?在这种情况下列表的值不是指数组的第一个字节? –

+1

将** $ **视为重载操作符。当它自己使用时,汇编程序更喜欢将它视为代码段中的位置计数器,但在像'$ - list'这样的表达式中,汇编器知道* list *标签属于哪个段,因此能够计算无论如何,这是一个相对值。 –