comprendre cmpb et boucles en langage d'assemblage
J'ai une fonction string_length qui a la séance suivante code
0x08048e90 <+0>: push %ebp
0x08048e91 <+1>: mov %esp,%ebp
0x08048e93 <+3>: mov 0x8(%ebp),%edx //assign whatever I declared into edx
0x08048e96 <+6>: mov $0x0,%eax //assign eax = 0
0x08048e9b <+11>: cmpb $0x0,(%edx) //compare edx to byte of 0 (null..?)
0x08048e9e <+14>: je 0x8048ea9 <string_length+25> //if equal, jump to +25
0x08048ea0 <+16>: add $0x1,%eax //else, add 1 to eax
0x08048ea3 <+19>: cmpb $0x0,(%edx,%eax,1) //compare byte 1*eax+edx with 0,
0x08048ea7 <+23>: jne 0x8048ea0 <string_length+16> //if not equal, back to +16
0x08048ea9 <+25>: pop %ebp //pop ebp
0x08048eaa <+26>: ret
Depuis le nom de la fonction est string_length, je suis en supposant qu'il sera de retour la façon dont beaucoup de caractères dans la chaîne.
ce que je suis confus au sujet de qui est le
cmpb $0x0,(%edx)
est-ce comparaison de tout ce qui est souligné edx à l'octet de 0, et 0 en ASCII est nul..?
et
cmpb $0x0,(%edx,%eax,1)
est de comparer, en octets, 1*eax+edx. Si edx est une chaîne de caractères, est-ce à dire edx va d'abord être converti sa valeur ascii, puis effectuer le calcul?
OriginalL'auteur user3277633 | 2014-04-02
Vous devez vous connecter pour publier un commentaire.
Ce:
prend un octet qui EDX points (j'. e. contient l'adresse de l') et la compare à zéro. Ce:
prend un octet qui EDX+EAX points et la compare à zéro. EDX sert de la chaîne de la base de pointeur, EAX est l'indice. L'échelle est de 1 parce que nous travaillons avec des octets. Pensez à la totalité de la boucle de cette façon:
for(eax=0; edx[eax] != 0; eax++)
.OriginalL'auteur Seva Alekseyev
L'équivalent du code C serait quelque chose comme ceci:
OriginalL'auteur Amro