2013-11-22 3 views
1

Мне нужна помощь в понимании MASM32 LOCAL Macro. Я знаю, что ЛОКАЛЬНЫЕ переменные нажимают на стек. Тем не менее, я пытаюсь использовать их для хранения временного значения. Вот быстрый фрагмент.Локальные переменные 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) Периоды ... Они оба не являются адресами, имеющими какую-либо ценность ... Действительно потеряны, как включить локальные переменные.

Side Примечание: Любопытного новое для программирования Ассамблеи ...

+0

В чем проблема? – Aaron

+0

Только что изменил вопрос, извините, любопытное в спешке ... Назначение через 3 часа ... ха-ха – NateAGeek

ответ

2

Местной (стек) переменной мнет КЭ инициализируется, если вы собираетесь его использовать. Таким образом, вы должны сделать somehting так:

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

Если вы используете переменные из BSS или DATA сегмента, они preinitialized, но стек переменные имеют значения, что бы ни случилось быть в стеке, когда функция вызывается ,

+3

Обнаружено, что MASM - это просто чистое зло ... Когда вы используете LOCAL macro, он также настраивает фрейм стека для вас. Это хорошо, если вы хотите настроить его !!!! evil ... pure evil – NateAGeek

+0

Однако, возможно, вы бы сэкономили мне время ... Тем не менее, потому что я не знал, что их нужно было использовать – NateAGeek

+0

Да, когда вы используете locals или params, тогда MASM автоматически создаст стековый фрейм с вами , Вот почему всегда полезно размещать полный образец кода. Если вы публикуете фрагмент, вы можете пропустить важные бит, и мы не можем знать, что неправильно, конечно. Имейте в виду, что если вы позволите masm создать стек для вас, вы должны использовать 'ret', а не i.e.' retn', иначе stackeframe не будет автоматически уничтожен, так как MASM также генерирует эпилог в этом случае. – Devolus

Смежные вопросы