2017-10-08 145 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 *標籤屬於哪個段,因此能夠計算無論如何,這是一個相對值。 –