Newsgroup: it.comp.programmare
Titolo: Assembly 80x86

Come avrete capito dall'altro post, dopo una infarinatura di 68000 sono 
passato(solo stamattina!) a studiare i processori intel.
Guardate questo codice:
.MODEL SMALL
         .STACK 100H
         .DATA
A       DW      104
B       DW      100
C       DW      52
RESULT  DW      ?
         .CODE
MAIN    PROC    FAR
         MOV     AX,@DATA   ;Load DS with assigned
         MOV     DS,AX      ; data segment address
         MOV  AX,A          ;Load A from memory
         SAR  AX,3          ;Divide A by 8
         ADD  AX,B          ;Add B to (A/8)
         SUB  AX,C          ;Subtract C from (A/8)+B
         MOV  RESULT,AX     ;Store A/8+B-C to RESULT
         MOV  AX,4C00H      ;Use software interrupt
         INT     21H        ; to terminate program
MAIN    ENDP
         END     MAIN
Due dubbi banali:
1) Perché usa la notazione ottale per caricare l'indirizzo di .DATA?
2) Possibile che debba essere il programmatore e non l'assembler ad 
occuparsi di inizializzare il puntatore al segmento dati?(DS)
Forse la risposta alla domanda due č: perchč č il sistema operativo a 
decidere dove mettere quei dati, ma non ne sono sicurissimo, quindi 
meglio chiedere.
Grazie.
-- 
Bonus di 25 euro su 
betfair.it
, codice da inserire: AAAACGWFG
Vai sul mio sito(in fondo alla pagina) per altri dettagli:
http://digilander.libero.it/maxxam99/

 occuparsi di inizializzare il puntatore al segmento dati?(DS)
Nel modello small inizialmente i quattro segmenti sono tutti uguali, 
cioè CS = DS = SS = ES. Se vuoi poter usare DS:0000h come prima 
locazione dei dati devi provvedere a mano come nel programma sopra, ma è 
solo un vezzo del programmatore, in realtà. Se ne può fare a meno senza 
problemi, visto anche che usi nomi simbolici per le variabili e quindi è 
l'assembler che si smazzerà la faccenda degli indirizzi.
Comunque l'asm 8086 è del tutto inutile oggi: parti almeno 
dall'assembler 386, che meno di quello non userai mai, anche nel caso di 
microcontroller... sì, vabbè, sono quasi uguali, ma tanti vecchi trucchi 
asm che erano utili con quei processori sono inutili e/o dannosi su 
quelli nuovi: dai 486 in su è molto più importante saper appaiare bene 
le istruzioni in modo da farne eseguire il più possibile in parallelo, 
evitare salti condizionati e istruzioni stringa (niente SCASB, MOVSB 
ecc.). Non prendere esempio dal vecchio codice 8086 perché ti troverai 
male dopo.

 dall'assembler 386
Fosse per me farei come dici, ma devo prepararci uno scritto e seguire 
il programma... :-(


 Quella chiocciola a che serve?
La chiocciola indica le label, cioč le etichette simboliche associate a 
determinati indirizzi di memoria. Di solito sono le destinazioni di 
salti diretti JMP o condizionati (la famiglia Jxx: JNE, JBE, JZ, JO ecc. 
ecc.) o delle istruzioni LOOP.
Subroutine_X	PUSH BP
		MOV BP, SP
		MOV AX, DATOA
		MOV BX, DATOB
Pincopallo	SAR AX, BX
		JC @Pincopallo
		POP BP
		RET
DATOA e DATOB sono due variabili globali, o comunque dichiarate 
esternamente alla subroutine stessa. SAR shifta AX a destra di tanti bit 
quanto č il valore di BX e mette l'ultimo di essi nel carry. JC testa il 
carry e salta se č =1. I giochetti con BP e SP sono per creare lo stack 
frame, cioč lo spazio per le variabili locali alla subroutine, che in 
genere viene allocato sullo stack in modo da liberarlo automaticamente 
all'uscita dalla stessa (qui č inutile perché non ce ne sono, ma 
vabbč... intanto vedi cos'č, cosě non ti spaventi quando ne incontri uno 
dal vero :-)

 dal vero :-)
Li avevo incontrati( di sfuggita) col 68000, anzi visto che ci siamo, 
vediamo se ricordo bene:
I parametri passati ad una subroutine vanno "sotto" il base pointer(o 
frame pointer), quindi quando li vogliamo usare nella subroutine ci 
servono displacement positivi rispetto al BP, mentre le variabili locali 
si trovano "sopra il BP", e quindi si "raggiungono" con displacement 
negativi....
Grazie infinite :-)


 negativi....
ok, vedo che hai studiato :-)

 ok, vedo che hai studiato :-)
Ci provo ;-)
Ciao.


 passato(solo stamattina!) a studiare i processori intel.
Una bella cosa che potresti fare, e' quella di riprendere tutti i tuoi
compitini fatti per il motorola e tradurli in intel.
Ti accorgerai che la logica e' praticamente la stessa.
Per ciascuna delle principali istruzioni del motorola c'e' una
corrispondente per l'intel.
A parte pochissime convenzioni di sintassi, la zuppa ha lo stesso
identico sapore.
Naturalmente ci sono parecchie differenze se ti capitera' di arrivare
a gestire interrupt o cose del genere, ma finche' si tratta di
prendere valori in memoria, sommarli, testare se fa zero, e scrivere
il risultato (che e' il 90% e passa di quello che si fa con
l'assembly), cambia veramente poco.

 altri post ;-)
A tal proposito oggi ti posso dire qualcosa di più:
L'ambiente è il gnu assembler, su Linux, sintassi AT&T quindi(sintassi 
simile a quella del 68000, almeno per l'ordine degli operandi)
Userò questi software:
"as" per assemblare
"linker" per linkare
e ddd per debuggare
p.s.
Se noti dagli header scoprirai che questo è il primo post da Linux, 
appena installato,  sto già preparando gli strumenti di lavoro! ;-)