Visual Studio 2008 Express странно компилирует инструкцию mov ecx, [XXXXXXXX] в инлайн-асме: Исходник: Код (Text): extern "C" { #include <ntddk.h> } // Driver entry point NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { __asm mov ecx, [0xFFDFF040] return STATUS_UNSUCCESSFUL; } Скомпилировано: Код (Text): .text:00010200 ; __int32 __stdcall DriverEntry(struct _DRIVER_OBJECT *, struct _UNICODE_STRING *) .text:00010200 public ?DriverEntry@@YGJPAU_DRIVER_OBJECT@@PAU_UNICODE_STRING@@@Z .text:00010200 ?DriverEntry@@YGJPAU_DRIVER_OBJECT@@PAU_UNICODE_STRING@@@Z proc near .text:00010200 mov ecx, 0FFDFF040h ; ??????????????????????????????????????????? .text:00010205 mov eax, 0C0000001h .text:0001020A retn 8 .text:0001020A ?DriverEntry@@YGJPAU_DRIVER_OBJECT@@PAU_UNICODE_STRING@@@Z endp Почему-то сгенерился опкод B9 40 F0 DF FF (mov ecx, 0ffdff040h) вместо 8B 0D 40 F0 DF FF (mov ecx, dword ptr [0ffdff040h]) Бага?
даже на Visual C++ 6.0 так же недокументированная возможность уронить вашу программу если вы вдруг захотите обратиться по абсолютному VA ? =))
Great Imho VC тут не причем. Посмотри на листинг от Код (Text): .386 .model flat .code mov ecx,[0FFDFF040h] end а потом на листинг Код (Text): .386 .model flat .code mov ecx,ds:[0FFDFF040h] end После непродолжительных поисков/раздумий мне не удалось найти/вспомнить ни одного примера (ни 16ти- ни 32ух-разрядного), чтобы в команде был записан адрес в виде числа и не был указан сегментный регистр. Примеров mov reg,dword ptr label полно. Afaik такая же ситуация с mov dword ptr label,reg. ps Может быть это специфика masm'а?