DOMANDA Asm At&t Puntatori

Robert T.

Utente Attivo
134
11
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

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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
Reazioni: signore del tempo

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!