Visual Studio 2008 Express inline asm bug

Тема в разделе "WASM.SOFTWARE", создана пользователем wasm_test, 30 ноя 2008.

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Visual Studio 2008 Express странно компилирует инструкцию mov ecx, [XXXXXXXX] в инлайн-асме:

    Исходник:
    Код (Text):
    1. extern "C" {
    2. #include <ntddk.h>
    3. }
    4.  
    5. // Driver entry point
    6. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
    7. {
    8.     __asm mov ecx, [0xFFDFF040]
    9.     return STATUS_UNSUCCESSFUL;
    10. }
    Скомпилировано:

    Код (Text):
    1. .text:00010200 ; __int32 __stdcall DriverEntry(struct _DRIVER_OBJECT *, struct _UNICODE_STRING *)
    2. .text:00010200                 public ?DriverEntry@@YGJPAU_DRIVER_OBJECT@@PAU_UNICODE_STRING@@@Z
    3. .text:00010200 ?DriverEntry@@YGJPAU_DRIVER_OBJECT@@PAU_UNICODE_STRING@@@Z proc near
    4. .text:00010200                 mov     ecx, 0FFDFF040h      ; ???????????????????????????????????????????
    5. .text:00010205                 mov     eax, 0C0000001h
    6. .text:0001020A                 retn    8
    7. .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])

    Бага?
     
  2. NDIS

    NDIS NDIS

    Публикаций:
    0
    Регистрация:
    16 авг 2007
    Сообщения:
    41
    Адрес:
    Москва
    VS Team System 2008 SP1: аналогичное поведение компилятора. Думаю, бага.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    даже на Visual C++ 6.0 так же

    недокументированная возможность уронить вашу программу если вы вдруг захотите обратиться по абсолютному VA ? =))
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Great
    Imho VC тут не причем. Посмотри на листинг от
    Код (Text):
    1. .386
    2. .model flat
    3. .code
    4.   mov ecx,[0FFDFF040h]
    5. end
    а потом на листинг
    Код (Text):
    1. .386
    2. .model flat
    3. .code
    4.   mov ecx,ds:[0FFDFF040h]
    5. end
    После непродолжительных поисков/раздумий мне не удалось найти/вспомнить ни одного примера (ни 16ти- ни 32ух-разрядного), чтобы в команде был записан адрес в виде числа и не был указан сегментный регистр. Примеров mov reg,dword ptr label полно. Afaik такая же ситуация с mov dword ptr label,reg.

    ps Может быть это специфика masm'а?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    q_q

    А так он генерит команду правильно, но с ненужным префиксом 3Eh =))