ASM [AIUTO] Bilanciare il carico su più cores

Stato
Discussione chiusa ad ulteriori risposte.

Solvay

Utente Electrum
17 Maggio 2016
188
36
3
100
Caro Re dell'assembly !!!
Se lei sta leggendo questo post ,perfavore mi chiarisca alcuni dubbi che mi tormentano notte,giorno,pomeriggio e cosi all'infinito...

Allora so che assembly può essere scritto in 4 modi :
8 bit
16 bit
32 bit (.386)
64 bit
L'unica cosa che non capisco è questa .
Se io mi cimenterò in un progetto da 32 bit ,ma vorrò che esso sfrutti tutti i core del processore,sara quindi possibile fare tale proggetto sfruttando Asm a 32 bit ?
oppure lo dovro fare per forza in 64 bit ,perchè la complessita delle ultime Cpu richiedono solo il grado superiore ai 32 bit fino a 64bit ?
Il progetto in questione ,ma anche come esempio alla domanda è il seguente.
Vorrei che il mio programmino possa dissiparsi su più core fisici e virtuali,in tal modo da diminure il carico sul singolo core .L'intento è proprio quello di farsi notare il meno possibile sulle risorse della cpu.
Qui magari mi potrei sbagliare per via della mia stessa ignoranza sull'argomento,però la mia logica è la seguente.
Dissipando il programma su più core per renderlo meno pesante su un singolo core,in tal modo,anche da poter utilizzare meglio alcune funzioni cryptografice che sono gia all'interno delle moderne cpu.
Grazie dell'attenzione
 
Come avrai sicuramente notato, il 90% dei software attualmente disponibili per windows è a 32bit, pertantoè vchiaramente possibile scrivere software in asm a 32bit su architetture a 64bit, a patto che si tratti di un'architettura che supporta quello specifico assembly, ma se si tratta di un computer sarà senz'altro così.
per quanto riguarda la questione del muticore, intanto ti posso dire che la parola dissipare è usata abbastanza impropriamente.
E' un discorso piuttosto complesso comunque quello della ripartizione del carico di lavoro su più core.
In particolare, ogni sistema operativo ha alla sua base uno scheduler, ed è lui che normalmente "decide" come e quando utilizzare una specifica cpu, programmando per il tuo sistema operativo non avrai il controllo completo su qeusto comportamenteo, specialmente se stai utilizzando windows.
Anche riuscendo ad operare una ripartizione perfetta poi, non sarebbe per nulla banale scrivere in assemblòy un codice tanto ottimizzato da fare quello che vuoi.
Provare per credere.
 
Ultima modifica:
Oki ,faccio un esempio più esteso .
Se lavoro su un virus scritto in asm .386 e voglio che tale virus mi mostri lo schermo della vittima in diretta ,questo di per se presuppone un carico non leggero sulla cpu stessa .
Quindi il cosidetto discorso della dissipazione che mi sono inventato sulle cinocchia,in realtà intende dire "un programma ottimizzato e leggero da eseguire"
Se il virus mi elabora lo schermo da farmi vedere su un core ,mi sa che il processore andrà un pò a fumo....
non voglio dare all'occhio all'antivirus stesso più di quanto all'utente che sentirà la sua ventola girare a mille.
Cioè capito il discorso?
mi ero comunque spiegato non bene prima ,ora spero di essere stato più chiaro.
A questo punto tutti voi siete i benvenuti ad aiutarmi per risolvere questo problema .
Grazie mille.
 
Come ti ha già risposto Evolution, un generico programma utente non può decidere il core che lo esegue, in quanto è una prerogativa del sistema operativo. L'unica cosa che puoi fare è sfruttare i thread che il tuo sistema operativo fornisce: semplicemente dividi il tuo programma in più thread (puoi farlo sia sfruttando le chiamate di sistema sia utilizzando librerie già pronte), e poi il sistema operativo, i cui progettisti sapranno sicuramente come ottimizzare al meglio l'esecuzione del programma, deciderà come ripartire i vari thread sui core fisici e virtuali. L'unica cosa che il programmatore finale può fare è la suddivisione in thread che ottimizzi l'esecuzione, il resto è compito del sistema operativo, non c'entra niente che il sistema operativo sia a 8, 16, 32, 64, 128 bit o più.
 
Come ti ha già risposto Evolution, un generico programma utente non può decidere il core che lo esegue, in quanto è una prerogativa del sistema operativo. L'unica cosa che puoi fare è sfruttare i thread che il tuo sistema operativo fornisce: semplicemente dividi il tuo programma in più thread (puoi farlo sia sfruttando le chiamate di sistema sia utilizzando librerie già pronte), e poi il sistema operativo, i cui progettisti sapranno sicuramente come ottimizzare al meglio l'esecuzione del programma, deciderà come ripartire i vari thread sui core fisici e virtuali. L'unica cosa che il programmatore finale può fare è la suddivisione in thread che ottimizzi l'esecuzione, il resto è compito del sistema operativo, non c'entra niente che il sistema operativo sia a 8, 16, 32, 64, 128 bit o più.
oki ,grazie .
 
Onestamente non credo che ti debba preoccupare più di tanto.
Anche perchè altrimenti programmi come RDP, VNC o teamviewer (che fanno esattamente quello che chiedi) dovrebbero saturare una CPU cosa che infatti NON avviene. Quindi per quale motivo dovrebbe avvenire nel tuo caso?
Al posto tuo non lo scirverei nemmeno in ASM, infatti potresti modificare realvnc, che è un software che fa già quello che chiedi, di cui è disponibile il codice sorgente qui quindi non vedo proprio perchè impegnarti in un software del genere che in asm sarebbe un lavoro titanico e che probabilmente non arriverebbe mai a compimento. Se il resto del virus è già scritto in asm, potrai sempre utilizzare delle librerie.
 
Oki ,faccio un esempio più esteso .
Se lavoro su un virus scritto in asm .386 e voglio che tale virus mi mostri lo schermo della vittima in diretta ,questo di per se presuppone un carico non leggero sulla cpu stessa .
Quindi il cosidetto discorso della dissipazione che mi sono inventato sulle cinocchia,in realtà intende dire "un programma ottimizzato e leggero da eseguire"
Se il virus mi elabora lo schermo da farmi vedere su un core ,mi sa che il processore andrà un pò a fumo....
non voglio dare all'occhio all'antivirus stesso più di quanto all'utente che sentirà la sua ventola girare a mille.
Cioè capito il discorso?
mi ero comunque spiegato non bene prima ,ora spero di essere stato più chiaro.
A questo punto tutti voi siete i benvenuti ad aiutarmi per risolvere questo problema .
Grazie mille.

Io ho fatto assembly 8086, già per dire se un numero è pari o dispari è una cancrata. Figurati scrivere un virus in assembly.....
Al posto tuo userei il C o il C++. È comunque un linguaggio di basso livello. Sarà pure più lento dell'asm ma almeno è più facile soprattutto se devi sviluppare una roba del genere.


Inviato dal mio iPhone utilizzando Tapatalk
 
Si lo so ,ma sento un certo debole verso il asm ,non so ne perchè ne come mai ,ma mi riesce quando mi ci metto.
 
Io ho fatto assembly 8086, già per dire se un numero è pari o dispari è una cancrata. Figurati scrivere un virus in assembly.....
Al posto tuo userei il C o il C++. È comunque un linguaggio di basso livello. Sarà pure più lento dell'asm ma almeno è più facile soprattutto se devi sviluppare una roba del genere.


Inviato dal mio iPhone utilizzando Tapatalk
Codice:
 test ax,0x1
 jz pari
 ;dispari
Potevi fare un esempio migliore, tipo stampare un intero a video.
Inoltre se vuoi che il virus si replichi all'interno dei programmi almeno una routine in assembly la devi scrivere.
 
Codice:
 test ax,0x1
 jz pari
 ;dispari
Potevi fare un esempio migliore, tipo stampare un intero a video.
Inoltre se vuoi che il virus si replichi all'interno dei programmi almeno una routine in assembly la devi scrivere.
Serio? Tipo a scuola avevamo fatto la stampa a video ed era abbastanza semplice (16/8 bit non ricordo), bastava settare ah a 09 e dx con l'indirizzo della stringa.

Inviato dal mio ALE-L21 utilizzando Tapatalk
 
Stampare una stringa a video è banale, un intero è già più intrigante (se passi l'intero 10 viene stampata la stringa "10")
 
Ultima modifica:
Sinceramente no ho la più pallida idea di cosa possa stampare o.o

Inviato dal mio ALE-L21 utilizzando Tapatalk
Prova a scrivere un programma in ASM per 8086 con interrupt del DOS che stampi il numero intero (senza segno) passato come input nel registro BX utilizzando solamente l'interrupt int 21h per stampare stringhe a video che segue le seguenti regole:
  • AH deve contenere il valore 09h;
  • DX deve contenere il puntatore al primo carattere della stringa da stampare terminata dal carattere $ (24h) che non verrà stampato;
Inoltre non potrai stampare caratteri superflui (spazi, zeri ininfluenti, ...), solamente i caratteri necessari alla rappresentazione di tale numero.

Un esempio di programma chiamante potrebbe essere questo (sia PRINT la funzione che stampa il numero):
Codice:
.code
start:
 mov bx,10h
 call PRINT ;COMMENTO: dovrebbe stampare a video il numero 16
 mov ah,4Ch
 int 21h
 
Prova a scrivere un programma in ASM per 8086 con interrupt del DOS che stampi il numero intero (senza segno) passato come input nel registro BX utilizzando solamente l'interrupt int 21h per stampare stringhe a video che segue le seguenti regole:
  • AH deve contenere il valore 09h;
  • DX deve contenere il puntatore al primo carattere della stringa da stampare terminata dal carattere $ (24h) che non verrà stampato;
Inoltre non potrai stampare caratteri superflui (spazi, zeri ininfluenti, ...), solamente i caratteri necessari alla rappresentazione di tale numero.

Un esempio di programma chiamante potrebbe essere questo (sia PRINT la funzione che stampa il numero):
Codice:
.code
start:
 mov bx,10h
 call PRINT ;COMMENTO: dovrebbe stampare a video il numero 16
 mov ah,4Ch
 int 21h
Mov Ah,09
Mov [0100],31h
Mov [0101],30h
Mov [0102],24h
Mov dx,0100
Int 21
Int 20

Funzionerà mai? XD

Inviato dal mio ALE-L21 utilizzando Tapatalk
 
Prova a scrivere un programma in ASM per 8086 con interrupt del DOS che stampi il numero intero (senza segno) passato come input nel registro BX utilizzando solamente l'interrupt int 21h per stampare stringhe a video che segue le seguenti regole:
  • AH deve contenere il valore 09h;
  • DX deve contenere il puntatore al primo carattere della stringa da stampare terminata dal carattere $ (24h) che non verrà stampato;
Inoltre non potrai stampare caratteri superflui (spazi, zeri ininfluenti, ...), solamente i caratteri necessari alla rappresentazione di tale numero.

Un esempio di programma chiamante potrebbe essere questo (sia PRINT la funzione che stampa il numero):
Codice:
.code
start:
 mov bx,10h
 call PRINT ;COMMENTO: dovrebbe stampare a video il numero 16
 mov ah,4Ch
 int 21h
Edit
 
Mov Ah,09
Mov [0100],31h
Mov [0101],30h
Mov [0102],24h
Mov dx,0100
Int 21
Int 20

Funzionerà mai? XD

Inviato dal mio ALE-L21 utilizzando Tapatalk
Non è quello che ho chiesto: non devi stampare solo il numero 16 (tra l'altro così stamperesti "10" e non "16"), ma un qualunque intero contenuto in bx, 16 era solamente un esempio, ma dovrebbe funzionare per qualunque numero contenuto in bx
 
Stato
Discussione chiusa ad ulteriori risposte.