Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› Evaluation Stack in .NET programs
Посл.ответ Сообщение


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 16 октября 2006 10:55
· Личное сообщение · #1

Всем привет!
Кто-нибудь может обьяснить по-русски, что такое Evaluation Stack в .NET программах? Как он работает? Почему Common Language Runtime называют stack machine? Почему Крис Касперски говорит о нем, что он(stack) на самом деле не существует? Где он (stack) находиться физически?
Что можно почитать по этому вопросу?
Заранее большое Спасибо!

-----
Give me a HANDLE and I will move the Earth.





Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
www.uinc.ru

Создано: 17 октября 2006 13:38
· Личное сообщение · #2

> Почему Common Language Runtime называют stack machine?

Видимо следует загуглить что-нибудь осмысленное, и понять что виртуальные машины бывают стэковыми и регистровыми. Тогда, возможно, станет понятно ограничение регистровых машин - сколько бы у нее ни было виртуальных регистров, они могут кончиться на сложных выражениях типа a = (b+c)*d + (e^f)/g - ..., тогда как стэковая машина будет складывать промежуточные результаты в "стэк", хотя это конечно не тот стэк к которому все привыкли =)




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 17 октября 2006 17:04 · Поправил: Nimnul
· Личное сообщение · #3

DrGolova пишет:
Видимо следует загуглить что-нибудь осмысленное, и понять что виртуальные машины бывают стэковыми и регистровыми.


Видимо следует понять что в .NET нет никаких виртуальных машин.

plutos

Стек в рантайме обычный как у обычных программ, то что нет нормальных дебугеров которые его показывают, не значит что его нет, а в илкоде стек имеет весьма абстрактное представление.


-----
have a nice day





Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
www.uinc.ru

Создано: 18 октября 2006 06:01
· Личное сообщение · #4

> Видимо следует понять что в .NET нет никаких виртуальных машин.

Кто же тогда выполняет MSIL? Не верю, что JIT компиляция происходит всегда и везде.




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 18 октября 2006 18:57 · Поправил: Nimnul
· Личное сообщение · #5

DrGolova пишет:

Не верю, что JIT компиляция происходит всегда и везде.


Видимо придется поверить Сам подумай кто бы делал JIT компилятор и ВМ эмулятор одновременно.


-----
have a nice day




Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 19 октября 2006 04:23 · Поправил: AlexZ
· Личное сообщение · #6

plutos пишет:
Почему Common Language Runtime называют stack machine? Почему Крис Касперски говорит о нем, что он(stack) на самом деле не существует? Где он (stack) находиться физически?

DrGolova пишет:
тогда как стэковая машина будет складывать промежуточные результаты в "стэк", хотя это конечно не тот стэк к которому все привыкли =)

Наверное речь идет о стэке вида:

[499] <-stack pointer
[......]
[003]
[002]
[001]
Если надо выполнить (a+b)*d^3 то в стэк складывается a, b, затем выполняется сложение, затем в стэк идёт d и ещё раз d, выполняется умножение, затем ещё раз d, затем умножение с лежащим в стэке результате (a+b). То есть выполняется операция над двумя верхними ячейками стэка, результат складывается во вторую, и указатель стэка уменьшается на 1.

-----
Я медленно снимаю с неё UPX... *FF_User*





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 19 октября 2006 08:16
· Личное сообщение · #7

Это:


int a = 0;
int b = 0;
int d = 0;

int c = (a + b)* d ^ 3;



в отладочной версии выглядит так:

int a = 0;
00000000 push ebp
00000001 mov ebp,esp
00000003 sub esp,14h
00000006 push edi
00000007 push esi
00000008 push ebx
00000009 mov dword ptr [ebp-4],ecx
0000000c xor ebx,ebx
0000000e xor esi,esi
00000010 xor edi,edi
00000012 mov dword ptr [ebp-14h],0
00000019 xor ebx,ebx
int b = 0;
0000001b xor esi,esi
int d = 0;
0000001d xor edi,edi
int c = (a + b)* d ^ 3;
0000001f lea eax,[ebx+esi]
00000022 imul eax,edi
00000025 xor eax,3
00000028 mov dword ptr [ebp-14h],eax
}
0000002b nop
0000002c pop ebx
0000002d pop esi
0000002e pop edi
0000002f mov esp,ebp
00000031 pop ebp
00000032 ret


-----
have a nice day



 eXeL@B —› Программирование —› Evaluation Stack in .NET programs
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати