OVH Cloud OVH Cloud

Pb de compilation avec VC++ 1.2

3 réponses
Avatar
Sivaller
Il s'agit d'inserez la chaine "essai" dans le code de la fonction "main"
void main()
{
_asm
{
jmp suite
db "essai"
suite:
}
}


Le compilateur visual studio me retourne
"
Compiling...
f:\projet\progra~1\bios\mother\v0.1\del.c
f:\projet\progra~1\bios\mother\v0.1\del.c(6) : error C2400: inline syntax
error in 'opcode'; found 'bad token'
CL returned error code 2.
DEL.C - 1 error(s), 0 warning(s)
"

Comment peux t'on employer des chaines en assembler ???

Merci BPC

3 réponses

Avatar
Pierre Maurette
"Sivaller" a écrit:

Il s'agit d'inserez la chaine "essai" dans le code de la fonction "main"
void main()
{
_asm
{
jmp suite
db "essai"
suite:
}
}
[rien sur le void main()]

Que votre compilateur accepte ou non la directive db, il ne faut pas
l'utiliser (à part pour implémenter des instructions non supportées).
En effet, celà conduit à placer des données, éventuellement non
constantes, dans un segment (au sens large, une zone en fait) de code.
La méthode normale est de déclarer vos données là où ça va bien, en
tenant compte de leur durée de vie et de leur visibilité espérées.

[c'est du C, en tous cas ça veut y ressembler vaguement ;-) ]
int main(void)
{
char chaine[] = "essai";
_asm
{
mov byte ptr [chaine + 0], 'M'
mov byte ptr [chaine + 1], 'E'
mov byte ptr [chaine + 2], 'R'
mov byte ptr [chaine + 3], 'D'
mov byte ptr [chaine + 4], 'E'
}
printf("Chaîne d'essai: %sn", chaine);
return 0;
}

Attention, regardez bien votre documentation sur l'usage des labels
dans du code asm (rapports avec les labels C/C++, syntaxe
particulière).
--
Pierre

Avatar
Sivaller
Sous borland c++ 4.x ca marche,
il y a bien une méthode pour le VC++.
Avatar
Pierre Maurette
"Sivaller" a écrit:

Sous borland c++ 4.x ca marche,
il y a bien une méthode pour le VC++.

Vous pouvez essayer _emit (je ne connais pas votre version de VC++).

Sert à réserver 1 octet (à priori pour écrire des macros (C++)
définissant des instructions non implémentées):

_asm
{
jmp suite
_emit 'e'
_emit 's'
_emit 's'
_emit 'a'
_emit 'i'
suite:
}

Mais je vouis répète que ce n'est pas la bonne méthode pour des
données "normales". A moins que vous ne souhaitiez obfusquer votre
code ?

Microsoft Specific

Although an __asm block can reference C or C++ data types and objects,
it cannot define data objects with MASM directives or operators.
Specifically, you cannot use the definition directives DB, DW, DD, DQ,
DT, and DF, or the operators DUP or THIS. MASM structures and records
are also unavailable. The inline assembler doesn't accept the
directives STRUC, RECORD, WIDTH, or MASK.

END Microsoft Specific

--
Pierre