2013-11-22 94 views
1

我需要幫助理解MASM32本地宏。我知道LOCAL變量被推入堆棧。但是,我試圖用它們來存儲一個臨時值。這是一個快速的片段。MASM32局部變量?

FormatError PROC USES EBX ECX 
LOCAL NumComma:DWORD, NumPeriod:DWORD 

。 。 。

.WHILE ecx < eax 
    mov bl, [edx + ecx] 
    .IF bl == "," 
     inc [NumComma] 
    .ELSEIF bl == "." 
     inc [NumPeriod] 
    .ENDIF 
    inc ecx 
.ENDW 

mov ebx, [NumComma] 
mov ecx, [NumPeriod] 

EBX = 004059B5h ECX = 7EFDE000h

有不4217269(004059B5h)逗號。並沒有2,130,567,168(7EFDE000h)期間... 他們似乎都不是具有任何價值的地址......真正失去了如何增加局部變量。

側面說明: 還挺新的編程大會...

+0

你的問題是什麼? – Aaron

+0

只是改變了問題,對不起,有點急......在3小時內完成作業......哈哈 – NateAGeek

回答

2

本地(棧)變量畝TBE如果你打算使用它初始化。所以,你應該做的服用點是這樣的:如果你正在使用從BSSDATA段變量

xor eax, eax 
mov NumPeriod, eax 
mov NumComma, eax 

,他們預先初始化,但堆棧變量有什麼恰好是棧,當該功能被稱爲值。

+3

發現MASM只是純粹的邪惡......當你使用LOCAL宏時,它也爲你設置了堆棧框架。 ..這很好除了當你想要設置它! 邪惡......純粹的邪惡 – NateAGeek

+0

然而,你可能會節省我的時間...仍然因爲我不知道他們必須被引用 – NateAGeek

+0

是的,當你使用本地或參數,MASM會自動創建你的堆棧。這就是爲什麼發佈代碼的完整樣本總是很好的原因。如果您發佈了一段代碼,您可能會錯過重要的部分,我們當然不知道最新的錯誤。請記住,如果你讓masm爲你設置堆棧,你必須使用'ret'而不是'retn',否則stackframe不會被自動銷燬,因爲MASM在這種情況下也會產生結尾。 – Devolus