2011-09-11 3 views
4

Je suis en train de travailler mon chemin à travers un fichier d'assemblage Intel et j'ai couru dans un peu de code que je ne comprends pas.Question sur l'assemblage Intel

# Save current stack pointer to old thread's stack, if any. 
movl SWITCH_CUR(%esp), %eax 
movl %esp, (%eax,%edx,1) 

I comprennent que la première ligne se déplace de la valeur de décalage du registre 12%esp dans le registre %eax.

Mais je ne comprends pas ce que la deuxième ligne se déplace %esp dans quoi.

Est-ce que (%eax,%edx,1) est une opération logique and? Ou plus?

Toute aide serait géniale.

Merci

Répondre

2

(%eax,%edx,1) fait référence à l'emplacement en mémoire dont l'adresse est formé en ajoutant la valeur %eax à la valeur %edx. Le 1 est le facteur d'échelle qui ne fait pas la « matière » parce qu'il est 1.

ADDENDA

En détail (au cas où quelqu'un d'autre sur les terres cette page):

mov %esp, %edx    # move contents of esp into edx 

En supposant que edx contient 100 et eax contient 20:

mov %esp, (%edx)   # move contents of esp in address 100 
mov %esp, (%edx,%eax)  # ... into address 100 + 20 = 120 
mov %esp, (%edx,%eax,4)  # ... into address 100 + (20*4) = 180 
+0

merci beaucoup c'est beaucoup plus clair maintenant, donc si par exemple le facteur d'échelle était 2 alors ce serait '(% eax +% edx) * 2' ?? –

+0

Non, ce type d'adressage est spécialement conçu pour accéder aux tableaux. Le premier opérande est l'adresse de base, et seul le second opérande (l'indice de tableau) est multiplié par la constante. –

+0

@Hunter Roland est correct. En x86, l'adressage est BASE + INDEX * SCALE. BASE est un registre à usage général sauf% esp, INDEX est un registre à usage général et SCALE est 1, 2, 4 ou 8. La notation dans la syntaxe ATT est '(base, index, scale)'. Dans Intel Sytax, nous écrivons '[BASE + INDEX * SCALE]'. –