DOMANDA Asm At&t Puntatori

Robert T.

Utente Attivo
Un piccolo dubbio che mi sta sorgendo in asm riguardo i puntatori IA32 AT&T . Allora dato questo codice:

movl $10, (%eax, %ecx, 4) <--- (base, indice, scala). La scala può essere 1-2-4-8, Sarebbe il valore di Byte, short, word, long word in IA32?. Cos'è esattamente la scala? e perchè se scrivo 2 invece di 4 o 8 invece di 4 il programma continua a funzionarmi correttamente?

Codice:
f:

    movl 8(%esp), %eax

    movl  12(%esp), %ecx

    movl $21, (%eax,%ecx,2)  # ma funziona anche con 4 e 8. Dunque cosa ci devo mettere veramente?

ret
 

DispatchCode

Utente Attivo
593
342
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
L'effective address dell'8086 può essere composto da uno spiazzamento, un indirizzo come [1234h], oppure per mezzo di spiazzamenti e registri, che prendono il nome di base, indice e spiazzamento. Puoi fare riferimento alla tabella dedicata al mod_reg_rm della seconda parte del mio articolo, Il Linguaggio Macchina dell'8086.

Ciò che fa la CPU 80386 è introdurre un fattore di scala. Oltre all'indirizzo specificato come già detto in precedenza (ovviamente, lo spiazzamento sarà una componente a 32bit ora), l'indice può essere moltiplicato per un fattore di scala che può essere uno dei valori che hai riportato.
Quindi:

Codice:
[EAX+(ESI*4)+00001234h]
Quando è presente un indice scalato, l'istruzione è lunga 1byte in più (il byte è chiamato SIB, Scaled Index Base, ed è una particolare codifica assunta da mod_reg_rm a segnalarne la presenza).
Per fare un esempio più pratico: se in ESI hai il puntatore iniziale ad un array di dword (32bit), puoi utilizzare un indice scalato di 4 che va a moltiplicare un indice incrementato di 1 unità ogni volta, così da avere un effective address che ad ogni ciclo punta al prossimo elemento dell'array; in codice:

Codice:
[ESI + (ECX*4)]
Quindi il tuo programma funziona semplicemente perchè l'indirizzo a cui accedi è corretto, ed il fattore di scala che specifichi è corretto.
 
  • Mi piace
Reactions: signore del tempo

Entra

oppure Accedi utilizzando