Quel est le sens de _AX = 1000 dans le programme C suivant?

Je suis un débutant en langage de programmation C, j’ai récemment commencé à apprendre des fonctions . J’ai étudié que les fonctions utilisent le mot-clé return pour renvoyer une valeur dans la fonction d’ appelant . Par exemple le programme suivant.

int getVal(){ return 1000; } int main(){ int x = getVal(); printf("x = %d",x); return 0; } 

imprimera x = 1000

mais je suis confus que (sous turbo C compilateur 32 bits) pourquoi le programme suivant produit une sortie en tant que x = 1000 aussi. S’il vous plaît, expliquez.

 int get_val(){ _AX = 1000; } int main(){ int x = get_val(); printf("x = %d",x); return 0; } 

La “valeur de retour” est renvoyée dans un registre particulier (défini par “ABI”, l’interface d’application binary, qui décrit comment les compilateurs doivent générer leur code), dans la plupart des systèmes x86, à savoir EAX (32 bits) ou AX (16). bit) [ne pas dire _AX n’est pas réellement EAX en interne].

Ce compilateur supporte évidemment l’utilisation d’un “registre” directement en le nommant _AX. Donc, en chargeant le registre [E] AX avec une valeur, nous retournons essentiellement cette valeur.

Cela ne fonctionnera certainement dans aucun autre compilateur, bien que l’assembleur en ligne puisse réaliser la même chose.

En C ici, _AX est un pseudo registre. Et quand vous faites AX=1000 , cette valeur 1000 est extraite de l’accumulateur

Mais cela peut ne pas fonctionner comme prévu dans le compilateur GCC

Comstackr et exécuter le programme suivant en Turbo C, vous obtiendrez 35 en sortie. Cela peut ne pas fonctionner dans d’autres compilateurs.

 #include int main() { int a = 0; a = 35; printf("%d"); return 0; } 

Supposons l’adresse de a = 1200. Supposons l’adresse de la mémoire vidéo = 5500;

 MOV AH, 35 MOV [1200], AH MOV [5500], AH // prints on the screen. 

C’est la façon dont l’exécution a lieu. Après avoir copié la valeur 35 dans l’emplacement 1200, AH conserve la valeur 35.

Puis printf("%d") essaie d’obtenir la valeur de AH et l’envoie à la mémoire vidéo pour l’afficher à l’écran.

Si nous utilisons printf("%d %d", age, salary) , la valeur de l’âge transférée à AH avant d’utiliser cette valeur pour l’envoi en mémoire vidéo. Ensuite, la valeur du salaire est déplacée vers AH, puis envoyée à la mémoire vidéo.

Suppose, adresse d’âge = 1200; Adresse du salaire = 1202; Adresse de la mémoire vidéo = XXXX; (Cela changera en fonction du nombre de caractères imprimés à l’écran, ne pensez pas beaucoup à cette adresse)

 MOV AH, [1200] MOV [XXXX], AH MOV AH, [1202] MOV [XXXX], AH 

J’espère que cela aidera à comprendre la solution pour le programme donné.

Selon le compilateur TC (32 bits), la valeur renvoyée par une fonction est stockée dans Accumulator (AC). Vous pouvez y accéder dans le compilateur TC à l’aide de _AX. Ainsi, lorsque vous écrivez:

 _AX = 1000; 

signifie que vous placez la valeur 1000 dans Accumulator et que, lorsque la fonction termine son exécution et que le contrôle parvient à la fonction appelant , la valeur de Accumulator est vérifiée et, dans ce cas, cette valeur sera stockée dans x.

ici la déclaration

 x = get_val(); 

serait simplement

 x = 1000; 

mais ce ne serait que dans votre cas, cela signifie en (compilateur de fenêtres TC 32 bits), cela pourrait ne pas fonctionner pour les autres compilateurs.

dans getval (), 1000 est stocké dans l’accumulateur, et getval () donnera le temps de compilation avertissant que la fonction doit renvoyer une valeur, puis, dans la partie principale, x se verra atsortingbuer la valeur renvoyée ou stockée dans l’accumulateur, qui est 1000; il imprimera x = 1000.