Langage d'assemblage pour C
Donc, j'ai l'assemblage suivant le code de langue qui j'ai besoin de convertir en C. je suis confus sur quelques lignes de code.
Je comprends que c'est un for
boucle. J'ai ajouté mes commentaires sur chaque ligne.
Je pense que le for
boucle va comme ceci
for (int i = 1; i > 0; i << what?) {
//Calculate result
}
Ce qui est la condition de test? Et comment puis-je le changer?
Regarder le code assembleur, ce que la variable 'n'?
C'est Intel x86 de sorte que le format movl = source, dest
movl 8(%ebp), %esi //Get x
movl 12(%ebp), %ebx //Get n
movl $-1, %edi //This should be result
movl $1, %edx //The i of the loop
.L2:
movl %edx, %eax
andl %esi, %eax
xorl %eax, %edi //result = result ^ (i & x)
movl %ebx, %ecx //Why do we do this? As we never use $%ebx or %ecx again
sall %cl, %edx //Where did %cl come from?
testl %edx, %edx //Tests if i != what? - condition of the for loop
jne .L2 //Loop again
movl %edi, %eax //Otherwise return result.
testl %edx, %edx vérifie si edx est de 0. et puis jne - saut si pas de zéro.
Les lignes qui êtes-vous confus? En C, une boucle for for(;;) {}
Pourquoi êtes-vous convertissez asm en C?
Pourquoi traduire à intel de la syntaxe?
Mais ce n'est pas illisible, tout est essentiellement le même, à l'exception de la commande...
Les lignes qui êtes-vous confus? En C, une boucle for for(;;) {}
Pourquoi êtes-vous convertissez asm en C?
Pourquoi traduire à intel de la syntaxe?
Mais ce n'est pas illisible, tout est essentiellement le même, à l'exception de la commande...
OriginalL'auteur Catie | 2010-10-24
Vous devez vous connecter pour publier un commentaire.
sall %cl, %edx
quarts %edx gauche par%cl
bits. (%cl
, pour référence, est l'octet de poids faible de%ecx
.) Le subséquentetestl
teste si ce changement est mis à zéro %edx.La
jne
est appelé ainsi parce que c'est souvent utilisé dans le contexte des comparaisons, en ASM ne sont souvent que des soustractions. Les drapeaux seraient fixés sur la base de la différence; ZF serait réglé si les éléments sont égaux (comme x - x == 0). Il est aussi appeléjnz
Intel syntaxe; je ne suis pas sûr de savoir si GNU permet que trop.Tous ensemble, les trois instructions traduire
i <<= n; if (i != 0) goto L2;
. Que plus l'étiquette semblent faire une boucle for.Ou, plus correctement (mais atteindre le même objectif), une boucle do...while.
OriginalL'auteur cHao