Unicorn with delicious cookie
Nous utilisons des cookies pour améliorer votre expérience de navigation. En savoir plus
Accepter
to the top
>
>
A common error occurring when compiling…

A common error occurring when compiling a 64-bit application: error C4235, Assembler

30 Oct 2010
Author:

Visual C++ does not support 64-bit inline assembler.

That is why you get an error when trying to compile a code like this:

void waitvrt(void)
{
  __asm {
      mov  dx,3dah
  VRT:
      in    al,dx
      test  al,8
      jnz    VRT
  NoVRT:
      in    al,dx
      test  al,8
      jz    NoVRT
  }
}
1>.\Third_party\Src\CreditsThread.cpp(111) :
error C4235: nonstandard extension used :
'__asm' keyword not supported on this architecture

If you still need to use assembler code, you may use a third-party 64-bit assembler, for example, MASM.

But you will most likely need to rewrite the existing code in C/C++. The assembler code is likely to be obsolete and it is more reasonable to use modern functions provided by operating systems or C/C++ constructs. Using assembler for the purpose of optimization can rarely be justified because Visual C++ compiler creates rather efficient code in most cases. Also, remember that you may use intrinsic-functions.

Intrinsic-functions are special system-dependent functions performing such actions that cannot be performed at the level of C/C++ code or that do it much more efficiently than other means. On the whole, they allow you to get rid of inline-assembler because it is often undesirable or impossible to use it.

Programs can use intrinsic-functions to create faster code because there are no expenses on calling common functions. Of course, the size of the code will be a bit larger. MSDN gives the list of the functions that can be replaced with their intrinsic-versions. For example, these are memcpy, strcmp, etc.

Microsoft Visual C++ compiler has a special option "/Oi" that allows you to replace the calls of some functions with their intrinsic-versions automatically.

Besides automatic replacement of common functions with intrinsic-versions, you may use intrinsic-functions in the code explicitly. This is why it may be useful:

  • As I have already said, inline assembler is not supported by Visual C++ in the 64-bit mode. But intrinsic-code is.
  • Intrinsic-functions are simpler to use because you do not need to know registers or other similar low-level constructs when dealing with them.
  • Intrinsic-functions are updated in compilers. But assembler code must be updated manually.
  • The embedded optimizer does not work with assembler code, so you need external linking of the module. But this all does not concern intrinsic-code.
  • Intrinsic-code is easier to port than assembler code.

Using intrinsic-functions in automated mode (with the help of the compiler switch) allows you to get some per cent of performance gain at no cost, and "manual" introduction of intrinsic-functions allows you to get even more. That is why using them is absolutely justified.

To learn more about intrinsic-functions see the Visual C++ team blog.

Popular related articles

S'abonner

Comments (0)

close comment form
close form

Remplissez le formulaire ci‑dessous en 2 étapes simples :

Vos coordonnées :

Étape 1
Félicitations ! Voici votre code promo !

Type de licence souhaité :

Étape 2
Team license
Enterprise licence
** En cliquant sur ce bouton, vous déclarez accepter notre politique de confidentialité
close form
Demandez des tarifs
Nouvelle licence
Renouvellement de licence
--Sélectionnez la devise--
USD
EUR
* En cliquant sur ce bouton, vous déclarez accepter notre politique de confidentialité

close form
La licence PVS‑Studio gratuit pour les spécialistes Microsoft MVP
close form
Pour obtenir la licence de votre projet open source, s’il vous plait rempliez ce formulaire
* En cliquant sur ce bouton, vous déclarez accepter notre politique de confidentialité

close form
I want to join the test
* En cliquant sur ce bouton, vous déclarez accepter notre politique de confidentialité

close form
check circle
Votre message a été envoyé.

Nous vous répondrons à


Si l'e-mail n'apparaît pas dans votre boîte de réception, recherchez-le dans l'un des dossiers suivants:

  • Promotion
  • Notifications
  • Spam