1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Ругается компилятор в ассемблерной вставке (глупый вопрос)

Тема в разделе "WASM.BEGINNERS", создана пользователем Vandal, 23 фев 2011.

  1. Vandal

    Vandal New Member

    Публикаций:
    0
    Регистрация:
    13 май 2010
    Сообщения:
    8
    Пытаюсь переводить программу с Паскаля на Си. При попытке компилирования выдается сообщение "Error. Expression Syntax" и курсор указывает на строку, выделенную жирным шрифтом. В версии программы на Паскале все компилируется нормально (ассемблер ведь, вроде бы, для всех одинаковый). Укажите, пожалуйста на ошибку, которую пытается показать компилятор. Заранее спасибо.

    Используемые версии компиляторов: Turbo Pascal 7, Turbo C 3.0.

    Код (Text):
    1.         if (((sb[3] & 0x80) != 0) && (sb[0] >= 4))
    2.         {
    3.             s[48] = 0;
    4.             asm{
    5.                 db 0x66, 0xB8; dd 0x80000002;
    6.                 db 0x0F, 0xA2;
    7.                 [b]db 0x66; mov word ptr [s[0]], ax;[/b]
    8.                 db 0x66; mov word ptr [s[3]], bx;
    9.                 db 0x66; mov word ptr [s[7]], cx;
    10.                 db 0x66; mov word ptr [s[11]], dx;
    11.  
    12.                 db 0x66, 0xB8; dd 0x80000003;
    13.                 db 0x0F, 0xA2;
    14.                 db 0x66; mov word ptr [s[15]], ax;
    15.                 db 0x66; mov word ptr [s[19]], bx;
    16.                 db 0x66; mov word ptr [s[23]], cx;
    17.                 db 0x66; mov word ptr [s[27]], dx;
    18.  
    19.                 db 0x66, 0xB8; dd 0x80000004;
    20.                 db 0x0F, 0xA2;
    21.                 db 0x66; mov word ptr [s[31]], ax;
    22.                 db 0x66; mov word ptr [s[35]], bx;
    23.                 db 0x66; mov word ptr [s[39]], cx;
    24.                 db 0x66; mov word ptr [s[43]], dx;
    25.             }
    26.             printf("Brand String:\n %s\n", s);
    27.         }
     
  2. Sunzer

    Sunzer New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    А какая строка тут выделена жирным шрифтом. И не глупо ли переводить с паскаля на си, путем ассемблера?
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Жирным шрифтом выделена строка, отмеченная тегами
    Код (Text):
    1. [b][/b]
    .
    Уберите одни квадратные скобки в каждой строке.
     
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Sunzer
    Это которая Код:
    Vandal
    +1 KeSqueer
    в ассемблере x86 нельзя адресоваться по адресу из переменной
    пишите просто mov word ptr [s+3], ax и т.д.
     
  5. Vandal

    Vandal New Member

    Публикаций:
    0
    Регистрация:
    13 май 2010
    Сообщения:
    8
    Не помогло. Убрал лишние скобки в каждой строке, но ошибка при компилировании осталась. Не знаю, насколько это важно, но компилятор ставит указатель не в начале строки, а а промежутке между db и 0x66;

    пременная s описана, как
    Код (Text):
    1. char s[255];
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    точка с запятой начинает комментарий, не?

    кстати, db/dd/dw насколько я знаю во вставках не поддерживаются.
     
  7. EOT

    EOT New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2010
    Сообщения:
    181
    [wiped]
     
  8. Vandal

    Vandal New Member

    Публикаций:
    0
    Регистрация:
    13 май 2010
    Сообщения:
    8
    EOT
    выше по тексту программы еще штук десять ассемблерных вставок с вызовом CPUID. там все вроде нормально. Проблема возникает только в строках с командами с индексной адресацией.

    Great
    Точка с запятой начинает комментарий в "чистом" асме. В ассемблерных вставках си точка с запятой отделяет команды, так же как и символ новой строки.

    И еще вопрос в ту же топку: если закомментировать эти строки, то программа компилируется, но на инструкции CPUID вылетает с криком "NTVDM CPU has encountered an illegal operation". Странно, но не далее, чем два дня назад мне удавалось читать Vendor String с помощью этой инструкции. ОС Windows7 Professional.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    видимо, зависит от реализаций си.
    в студии это комментарий.
     
  10. Vandal

    Vandal New Member

    Публикаций:
    0
    Регистрация:
    13 май 2010
    Сообщения:
    8
    Собственно говоря, проблема решилась сменой компилятора с "Turbo C" на "Borland C 3.1".