|
|
|
![]() |
|
Strumenti |
![]() |
#81 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Allora non sono l'unico!!!
Codice:
//TCP Header structure as per RFC 793 struct tcphdr { u_short th_sport; /* source port */ u_short th_dport; /* destination port */ tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ #if BYTE_ORDER == LITTLE_ENDIAN u_int th_x2:4, /* (unused) */ th_off:4; /* data offset */ #endif #if BYTE_ORDER == BIG_ENDIAN u_int th_off:4, /* data offset */ th_x2:4; /* (unused) */ #endif u_char th_flags; #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define TH_PUSH 0x08 #define TH_ACK 0x10 #define TH_URG 0x20 #define TH_ECE 0x40 #define TH_CWR 0x80 #define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR) u_short th_win; /* window */ u_short th_sum; /* checksum */ u_short th_urp; /* urgent pointer */ }; Nel codice copiato, si fa la distinzione fra big endian/little endian ma non e' che faccia senso, visto che definiscono 8 bit. Tornando a bomba sui linguaggi ad alto livello pascal/python/modula 2/...: come diceva cdimauro, i set hanno una implementazione piu' "matematica", corrispondente agli insiemi. I bitfield e le operazioni di masking del C, no! Questo perche' sono fatte in primis per l'accesso all'hardware, cosa che certamente i linguaggi citati non prevedono
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#82 | |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
Quote:
![]()
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
|
![]() |
![]() |
![]() |
#83 | |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
Quote:
Il C è quasi un asm astratto a mio parere ![]()
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
|
![]() |
![]() |
![]() |
#84 | ||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Visto che hai tirato in ballo i suffissi, beh, sono inutili! Se specifichi che il registro di destinazione è eax, è già evidente che sto usando un long. Avrebbe senso per la memoria, ma se la sorgente è eax, la destinazione sarà a 32 bit... Con gli immediati il discorso cambierebbe, ma nel codice più frequente il suffisso nella sintassi AT&T è superfluo. ![]() Quote:
Per il resto, con 8 bit l'endianess c'entra poco. Quote:
Quote:
Per questo viene considerato come linguaggio di medio-basso livello.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||
![]() |
![]() |
![]() |
#85 | |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
Quote:
![]()
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
|
![]() |
![]() |
![]() |
#86 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Capisco, ma c'è da spararsi a lavorare con quella sintassi. Lavorare in assembly è già un martirio: figuriamoci in quelle condizioni.
Io, ad esempio, non ho apprezzato nemmeno la sintassi "classica", e almeno per 65C02 e PIC Microchip ho realizzato delle mie versioni di assembly ad alto livello, che mi consentono di scrivere codice di basso livello, ma in maniera più pratica e comoda.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#87 | |||
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Giustissimo Quote:
![]() Quote:
Allora, guardando in giro posso dire: cdimauro ha ragione su tutta la linea, non esiste assolutamente uno standard. Tuttavia a causa di evidenti limitazioni nella soluzione opposta, l'allocazione partendo da lsb e' uno standard de-facto. Sempre che, con il linguaggio C, si possa parlare di standard
__________________
In God we trust; all others bring data |
|||
![]() |
![]() |
![]() |
#88 | |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
Quote:
C'è solo vantaggio a leggerle entrambe. Cmq, uscendo un po dal seminato, sto dando un occhio ad ARM... non male come ABI, pi+ semplice di x86/x64 ma, per alcune operazioni, molto veloce.
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
|
![]() |
![]() |
![]() |
#89 | |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
Quote:
![]()
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
|
![]() |
![]() |
![]() |
#90 | |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
Quote:
![]()
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
|
![]() |
![]() |
![]() |
#91 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Il primo fatto vuol dire che se io ho una qualsiasi informazioni che riesco a rappresentare con un numero limitato di bit posso fare la stessa operazione contemporaneamente su piu' valori. Quello degli insiemi di interi di cui si parlava prima e' un esempio. Posso rappresentare un insieme di piccoli numeri (<64 su una macchina a 64bit) con un singolo intero. Operazioni come intersezione o unione si fanno con una unica operazione bitwise. Una rappresentazione con una lista di numeri richiede molte piu' operazioni. A seconda del contesto questo potrebbe fare la differenza. La cosa si puo' estendere semplicemente ad insiemi piu' grandi. Il secondo fatto vuol dire che io posso rappresentare piu' informazioni su un unico intero. Questo diventa molto comodo quando voglio trasferire dell'informazione e mi interessa minimizzare lo spazio utilizzato. Un esempio pratico sono i flag su un header di un pacchetto TCP (o anche IP), visto che posso usare un singolo bit per rappresentare il valore attivo o meno del flag. Le operazioni bitwise mi serviranno per estrarre il valore del singolo flag. Un'altra applicazione e' quella di aggiungere delle informazioni ai puntatori in linguaggio di programmazione. In questo caso lo scopo e' quello di evitare una doppia reindirezione piuttosto che limitare l'uso della memoria. Pensa ad un linguaggio di programmazione dinamico, come puo' essere ruby. Come faccio a rappresentare un numero intero e a distinguerlo da un oggetto vero e proprio quando lo passo a funzioni e metodi ? Una possibilita' e' di farne il cosidetto boxing e usare un oggetto per tenerne il contenuto vero e proprio, col problema che pero' nella migliore delle ipotesi raddoppio la memoria utilizzata. Con un linguaggio statico posso sapere a priori che e' un numero e quindi passare come argomento direttamente il valore. Oppure posso sfruttare il fatto che solitamente la memoria che alloco allineato alla parola, per cui su macchine a 32 bit avro' i due bit piu' bassi sempre a 0. Perche' non sfruttarli per tenere delle informazioni aggiuntive ? Ad esempio potrei decidere che se metto 01 invece che 00 so che si tratta di un numero, usando un po' di shifting prima/dopo le operazioni sui numeri. Storicamente, nei GC mark-and-sweep e compagnia, si usava un bit per la marcatura del puntatore durante la fase di mark. Insomma esempi di uso se ne trovano a bizzeffe.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
#92 |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
bellissimo intervento che offre ottimi spunti, grazie
![]()
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
![]() |
![]() |
![]() |
#93 | |||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Lo stesso vale per il Modula-2 e il suo bitset. La differenza, rispetto al C, è che questi linguaggi offrono un meccanismo più comodo e di alto livello per fare sostanzialmente le stesse cose. Quote:
Quote:
Quote:
Quest'ultima ha un vantaggio nelle chiamate al kernel, soprattutto grazie al fatto che viene effettuato il banking dei registri, per cui ci si trova con dei registri immediatamente utilizzabili (senza doverli salvare prima nello stack, ad esempio). Quote:
Quote:
Quella di utilizzare i bit bassi di un puntatore per indicare il tipo dell'oggetto oppure la presenza di un intero o altro, la cullo da tempo per la virtual machine di Python. Ne abbiamo parlato con un altro paio di core dev che lavorano sulla virtual machine, all'ultima EuroPython, ma il problema più grosso è che si tratta di una modifica enorme, che impatterebbe praticamente tutto. L'idea è concreta, visto che i puntatori sono tutti allineati almeno a 8 byte (e a 16 per le architetture a 64 bit; adesso non ricordo bene, però), per cui i primi 3 bit (bassi) sono sempre a zero e potrebbero essere utilmente impiegati per specificare immediatamente il tipo. C'è, però, da pagare il prezzo del masking per ogni operazione: per ripulire i 3 bit bassi quando si è in presenza di un puntatore vero e proprio, e per eliminarli del tutto se abbiamo un intero. Questa cosa si deve fare ogni volta che si deve manipolare il puntatore o l'intero, ed è questo il deterrente principale nell'utilizzo di questa tecnica. In ARM64 è stata fatta una cosa molto utile, a cui ho pensato da molto tempo che si potesse applicare a x64: l'uso degli 8 bit alti dei puntatore come tag. In pratica il processore taglia via in automatico gli 8 bit alti ogni volta che usa un puntatore per referenziare la memoria, realizzando in hardware quello che, invece, dovremmo implementare in software. Il fatto che siano ben 8 bit sarebbe molto comodo perché consentirebbe di specificare diversi tipi di dati. Spero che AMD o Intel facciano la stessa con le future implementazioni di x64: sono anni che lo auspico. Tanto il futuro è rappresentato da macchine a 64 bit, e questa sarebbe un'utilissima funzionalità.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|||||||
![]() |
![]() |
![]() |
#94 | |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
Quote:
In effetti ARM diventa sempre più interessante come architettura ![]()
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
|
![]() |
![]() |
![]() |
#95 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Se riscrivi completamente l'architettura, beh, puoi fare quello che vuoi (e anche di meglio, te l'assicuro
![]() ARM64 della vecchia ARM ha mantenuto soltanto il nome. Poi, ok, è in grado di eseguire il vecchio codice, ma ARM ha introdotto una nuova modalità d'esecuzione a 64 bit, e con un'ISA anch'essa completamente diversa. Per rendere l'idea, è simile a quanto ha fatto AMD con x64. Anche se AMD è stata molto meno drastica (perché ha mantenuto la vecchia opcode table, cambiando un po' di cose).
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#96 |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
a volte la rottura totale e la scelta migliore.
Non si può supportare a vita con retrocompatibilità. ![]() P.S: ARM64 clean and elegant and ARM goes 64bit (più specifico)
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go Ultima modifica di The_ouroboros : 24-02-2013 alle 09:10. |
![]() |
![]() |
![]() |
#97 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
ARM64 la conosco abbastanza.
![]() Comunque è "clean" perché riprogettata da zero. Ma hanno dovuto fare delle scelte di compromesso (infatti hanno buttato via alcuni pilastri della vecchia architettura ARM). Però è anche "fat": opcode soltanto a 32 bit. Mentre ARM aveva tirato fuori quelli a 16-32 bit con Thumb/2, e che aiutavano molto ad aumentare la densità di codice.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#98 | |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
Quote:
![]() Ma non credo ci troverai nulla di nuovo ![]() Thumb/2 mi aveva sempre incuriosito ai tempi di quando mi sono interessato agli smartphone android/ios ![]() P.S: Modalità Thumb: ad ARM si sono ristretti… gli opcode! e Thumb/2 (Con Thumb-2 ARM tradisce i RISC e ritorna… ai CISC! )
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go Ultima modifica di The_ouroboros : 24-02-2013 alle 09:36. |
|
![]() |
![]() |
![]() |
#99 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Thumb/2 è molto usata proprio per ridurre la dimensione del codice, ed è molto importante proprio in dispositivi come smarthphone e tablet (ma anche sistemi embedded e microcontrollori). Ecco perché ha avuto un notevole successo.
Purtroppo di altri link sull'ARM64 non saprei cosa darti.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#100 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Supponendo di utilizzare 4 bit per i tag, uso il pattern 0000 e 1000 per (rispettivamente) interi pari e dispari: la somma rimane invariata, per la moltiplicazione mi basta un preshift di uno dei due operandi di 3 bit etc. Mi rimane da ripulire il puntatore nel caso sia un puntatore vero e proprio, ma alla fine nessuna alternativa e' piu' economica... se non devo ripulire dovro' aggiungere un offset (per la parola successiva) etc.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:59.