Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

Volevo capirci qualcosa....

1 Life, 1 Avatar <3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
Come col C++, voglio arrivare a capire almeno cosa significano le cose, non dico voglio arrivare a creare un hack per il pentagono dell'america....
allora ho cercato una guida per Assembly, e ho trovato questo programmino...
So che i ; sono come i // in c++
ma non capisco cosa significano
mov dx,OFFSET Message
mov ax,SEG Message
mov ds,ax
cioè ho letto cosa significano ma è in inglese e non li capisco, com è in italiano??


Listing 1: 1STPROG.ASM
; This is a simple program which displays "Hello World!"
; on the screen.

.model small
.stack
.data

Message db "Hello World!$" ; message to be display

.code

mov dx,OFFSET Message ; offset of Message is in DX
mov ax,SEG Message ; segment of Message is in AX
mov ds,ax ; DSHappywideX points to string

mov ah,9 ; function 9 - display string
int 21h ; call dos service
mov ax,4c00h ; return to dos DOS
int 21h

END start ;end here

22/09/2012, 23:12
#1
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 22/09/2012, 23:32 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
beh hai preso un sorgente davvero vecchio, fatto per macchine a 16bit, un sorgente cosi ti complica solo la vita e non ti fa capire molto.
Perchè? perchè ai tempi dei 16 bit non riuscivi ad indirizzare tutta la memoria disponibile usando semplicemente un registro (come invece avviene oggi con i 32 e 64 bits) allora si erano inventati la "segmentazione" quindi il registro indirizzava una pezzo di memoria all'interno di una "finestra" data dal "segmento".
Quindi, considerando che dx e ax sono 2 registri dell CPU, le 2 righe che dici tu:

Codice:
mov dx,OFFSET Message     
mov ax,SEG Message     
mov ds,ax

altro non fanno che caricare nel registro DX l'offset della variabile (area di memoria) chiamata "Message" all'interno del segmento, che invece viene messo in DS (data segment) passando da AX
Perchè questo?
perchè ai tempi il modo in cui chiamavi le routine di sistema era tramite chiamate a "interrupts" e prima della chiamata dovevi caricare i registri con i parametri necessari.
Nel caso del tuo esempio, il sorgente serve a visualizzare a video (parliamo del DOS) la stringa Hello World
La funzione di sistema per stampare a video usata è la 9 (da caricare nel registro AH) dell'interrupt 21h

Questa funzione si aspetta in input che i registri DSHappywideX (segmento:offset) puntino al messaggio da printare

Questo è il motivo di quel codice che hai visto.

Comunque come ti dicevo ti consiglio di lasciar perdere sti source di asm vecchi di anni ti depistano e basta, cercati qualcosa di piu recente Wink


digger
22/09/2012, 23:29
#2
Cerca

1 Life, 1 Avatar <3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
Puoi mandarmene una recente in mp??

23/09/2012, 0:21
#3
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 23/09/2012, 11:37 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
non penso serva un mp non è niente di impubblicabile Smile
secondo me devi vedere i tutorials di iczelion's
sono vecchiotti anche questi però sono ancora validi e secondo me sono scritti bene,
inoltre partono dalle basi-basi per andare a cose piu complicate quindi sono perfetti per capire le cose un po' alla volta

nel sito guarda i links a sinistra alla voce "Win32 Assembly"
link:

[Per vedere i link devi REGISTRARTI.]


scusate il doppio post ma voglio mettere in evidenza questa cosa,
Pocciox, comunque se davvero vuoi capirci qualcosa io ti do un consiglio diverso, non stare a programmare in ASM che non è molto semplice e non ti chiarisce molto lo stesso.
La cosa migliore per capire l'asm (almeno quello che serve a te immagino) è di scrivere semplici programmi in C/C++ e poi aprire l'eseguibile in OllyDbg dove vedi la traduzione in ASM.

In questo modo è molto semplice, il C è piu semplice da scrivere e siccome sai il tuo programma cosa fa, è semplice anche in ASM capire come ragiona, dai retta a me Wink


digger
23/09/2012, 11:33
#4
Cerca

1 Life, 1 Avatar <3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
Aaah digger questa è davvero una cosa furba Huh
infatti cercavo proprio quello, una traduzione dal C++...
beh proverò a tradurre uno di quei programmi semplici con il printf ...

23/09/2012, 12:07
#5
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
se vai a vedere in programmazione ti ho postato un video e una piccola guida su come partire con sta cosa Wink


digger
23/09/2012, 12:58
#6
Cerca

1 Life, 1 Avatar <3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
Grazie digger ti adoro <3
+1

23/09/2012, 13:11
#7
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
grazie Happywide


digger
23/09/2012, 13:43
#8
Cerca




Utenti che stanno guardando questa discussione: 1 Ospite(i)