Я думаю, что оригинальный код не делает то, что вы думаете, он делает. Согласно msdev разборка:
003AFCFC FF 35 D0 07 00 00 push dword ptr ds:[7D0h]
Что равно толчку:
*((DWORD*)2000)
НЕ помещает значение 2000 в стек. Однако - если это действительно то, что вы хотите, то инструкция:
push dword ptr ds:[2000]
ds:
указывает на использование сегмента ds
. Сегментные регистры - это удержание от неприятных 16-битных дней. Основными из них являются cs
- сегмент кода, ds
- сегмент данных и ss
- сегмент стека (и fs
, в котором хранятся локальные потоки). Думайте о них как о базовых смещениях в памяти. По умолчанию доступ к данным отключен от сегмента ds
.
Мое предположение относительно того, почему push dword ptr [2000]
не сработало, заключается в том, что компилятор понял, что это глупо для вас, и «исправил». Принудительно используя префикс ds
, вы указываете, что действительно хотите получить доступ к памяти.