Другие языки программирования и технологии

Ассемблерная вставка в С .Странный код. Можете расшифровать?

Дан код на ASM, дублирующий код на С упаковывающий битовые группы. Не смотря на то, что код являлся примером лабораторной, он не компилируется из-за непонятных команд на ассемблере. Не смог найти их описание в интернете, но есть подозрение, что это команды ассемблера для Linux. Объясните, если можете, что не так с кодом, или объясните как нормально реализовать код на си в ассемблерной вставке.

Код на С++ http://pastebin.com/1DBFk6C4
Код на ASM http://pastebin.com/qa8GJeqH
Это не синтаксис AT&T. Это какой-то гибридный, смесь Intel и AT&T. Возможно, разработан для учебных целей.

"Не так" в нём то, что к мнемоникам инструкций добавлены суффиксы размеров операндов (как в AT&T):
b - byte (8 разрядов) ;
w - word (16);
l - long (32).

#include
using namespace std;

int main()
{
  unsigned char xxx, www, xxx_a, www_a;
  unsigned short yyy, zzz, yyy_a, zzz_a;
  unsigned long value, value_a;
  unsigned short tmp;

  cout << "\n\t\tУпаковка битовых групп"
      << "\n\tУпаковать битовые группы, содержащиеся в целых числах, "
      << "\n\t\tв 32-битовое целое число Value";
  for (;;)
  {
    cout << "\nПожалуйста, введите 2 16-ые цифры для XXX (например, 5a):";
    cin >> hex >> tmp; xxx = tmp;
    cout << "Пожалуйста, введите 3 16-х цифры для YYY (например, 9db):";
    cin >> yyy;
    cout << "Пожалуйста, введите 4 16-х цифры для ZZZ (например, 8e7f):";
    cin >> zzz;
    cout << "Пожалуйста, введите 2 16-х цифры для WWW (например, 14):";
    cin >> tmp; www = tmp;
    xxx_a = xxx; yyy_a = yyy; zzz_a = zzz; www_a = www;

    //===================== C ========================
    www &= 0x1f;
    zzz &= 0xfff;
    yyy &= 0x1ff;
    xxx &= 0x3f;
    value = xxx;
    value = (value << 9) | yyy;
    value = (value << 12) | zzz;
    value = (value << 5) | www;

    //==================== Asm =======================
    _asm
    {
      and xxx_a,0x3f
      and yyy_a,0x1ff
      and zzz_a,0xfff
      and www_a,0x1f
      xor eax,eax
      or al,xxx_a
      shl eax,9
      or ax,yyy_a
      shl eax,12
      or ax,zzz_a
      shl eax,5
      or al,www_a
      mov value_a,eax
    }

    cout << hex << value << "\t" << value_a;
  }
  return 0;
}
Дмитрий Донцов
Дмитрий Донцов
51 590
Лучший ответ
Дмитрий Донцов Оп! Опять стало вырезать в угловых скобках. Неужели BBcode вернули на Ответы или html-теги?

А в include было
#include < iostream>