Bonsoir. Désolé, j'ai utilisé google tradutor. J'utilise NASM dans VC ++ sur x86 et j'apprends à utiliser MASM sur x64.
Existe-t-il un moyen de spécifier l'emplacement de chaque argument et du retour d'une fonction d'assemblage de telle sorte que le compilateur parvienne à y laisser les données de la manière la plus rapide ? On peut aussi spécifier quels registres seront utilisés de sorte que le compilateur sache quelles données sont encore sauvegardées pour en faire le meilleur usage ?
Par exemple, comme il n'existe pas de fonction intrinsèque qui applique exactement l'IDIV r/m64 (division d'entiers signés de 64 bits en langage assembleur), nous devrons peut-être l'implémenter. L'IDIV exige que la partie basse du dividende/numérateur soit dans RAX, la partie haute dans RDX et le diviseur/dénominateur dans un registre quelconque ou dans une région de la mémoire. À la fin, le quotient est dans EAX et le reste dans EDX. On peut donc vouloir développer des fonctions ainsi (je mets des inutilités pour exemplifier) :
void DivLongLongInt( long long NumLow , long long NumHigh , long long Den , long long *Quo , long long *Rem ){
__asm(
// Specify used register: [rax], specify pre location: NumLow --> [rax]
reg(rax)=NumLow ,
// Specify used register: [rdx], specify pre location: NumHigh --> [rdx]
reg(rdx)=NumHigh ,
// Specify required memory: memory64bits [den], specify pre location: Den --> [den]
mem[64](den)=Den ,
// Specify used register: [st0], specify pre location: Const(12.5) --> [st0]
reg(st0)=25*0.5 ,
// Specify used register: [bh]
reg(bh) ,
// Specify required memory: memory64bits [nothing]
mem[64](nothing) ,
// Specify used register: [st1]
reg(st1)
){
// Specify code
IDIV [den]
}(
// Specify pos location: [rax] --> *Quo
*Quo=reg(rax) ,
// Specify pos location: [rdx] --> *Rem
*Rem=reg(rdx)
) ;
}
Est-il possible de faire quelque chose d'au moins proche de cela ? Merci pour toute aide.
S'il n'y a aucun moyen de le faire, c'est dommage car ce serait certainement un excellent moyen d'implémenter des fonctions de haut niveau avec des caractéristiques de niveau assembleur. Je pense que c'est une simple interface entre C ++ et ASM qui devrait déjà exister et permettre au code assembleur d'être intégré en ligne et à haut niveau, pratiquement comme du simple code C++.