Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
"Sivaller" <sivaller@sivaller.no-ip.org> 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
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
Sivaller
Sous borland c++ 4.x ca marche, il y a bien une méthode pour le VC++.
Sous borland c++ 4.x ca marche,
il y a bien une méthode pour le VC++.
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
"Sivaller" <sivaller@sivaller.no-ip.org> 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):
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.
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.