Assembler: Leggere una locazione di memoria

Devo usare la porta parallela del mio PC, ma sto avendo dei problemi con le locazioni di memoria. So che sistemi operazivi come Ms-dos memorizzano l'indirizzo base della Lpt1 all'indirizzo 0000x0807 e che tale indirizzo è

0000x0378. Informazione che effettivamente ho verificato con Debug:

-d 0:408

0000:0400 78 03 00 00 00 00 26 03 0000:0410 27 D4 00 80 02 00 00 A0-00 00 32 00 32 00 67 22 0000...................

il problema è che non riesco a leggere tale valore mediante i comandi:

mov dx, 0408 in al, dx

il risultato di queste operazioni mi fornisce il valore AX = 00FF (diverso da quello atteso).

Come posso fare per ottenere nel registro AX il valore 0378 ?

Inoltre perchè ottengo oprio il valore 00FF ? Immagino che il mio problema è dovuto al fatto che stia puntando ad un segmento dati sbagliato. Ma visualizzando la locazione 0408 del segmento dati corrente non leggo il valore FF. Il puntatore al segmento dei dati non è il registro DS ? Ma anche impostando DS = 0000 le cose non cambiano.

Ho avuto un ulteriore sconforto quando unsando il basic ho scritto:

PRINT INC (0408)

ottenendo come risultato 255 = HFF.

Aiutatemi.

Reply to
Paky
Loading thread data ...

"Paky"

le

Scusa ma non ho capito una cosa: l'indirizzo base della LPT1 è memorizzato all'indirizzo 0000x0807. Perchè tu vai a leggere all'indirizzo 0000x0408 ?

------ SiO2

------

Reply to
SiO2

In tanto l'indirizzo base per la prima parallela e' 40:8

-d 40:8 sembra uguale....

e la vedo molto dura leggere la porta 378 cosi' visto che stai leggendo la

408

Prima devi leggere il contenuto della cella 40:8 POI metterlo in dx

anche se la cosa poi non ha un vero senso pratico...

meglio un classico:

mov dx,378 in al,dx

e comunque.... Mi sa che ti devi ripassare un po' asm.... e architettura della parallela.. hai le idee un po' confuse.

Reply to
Allen

Forse mi sono espresso male. All'indirizzo 0000x408 è contenuta la locazione di memoria base della porta lpt1 (ovvero è contenuto il valore 0000x0378) quando (usando debug) scrivo il comando d 0:408 (che consente di visualizzare i dati contenuti in detta locazione) ottengo:

0000:0400 78 03 00 00 00 00 26 03 0000:0410 27 D4 00 80 02 00 00 A0-00 00 32 00 32 00 67 22 0000...................

il che conferma che quanto ho detto è vero. (Infatti nell'elenco dei numeri i primi due sono 78 e 03. Che sono memorizzatti in ordine inverso. Invertendoli ottengo l'indirizzo 0378.)

Ora, oppurato che nella locazione 0000:408 c'è il valore 78, voglio leggere tale valore mediante comandi assembler. Per fare questo scrivo:

mov dx, 0408 in al, dx

ma in al non ottengo il valore 78 ma il valore FF. Cosa sbaglio?

Reply to
Paky

Forse mi sono espresso male. All'indirizzo 0000x408 è contenuta la locazione di memoria base della porta lpt1 (ovvero è contenuto il valore 0000x0378) quando (usando debug) scrivo il comando d 0:408 (che consente di visualizzare i dati contenuti in detta locazione) ottengo:

0000:0400 78 03 00 00 00 00 26 03 0000:0410 27 D4 00 80 02 00 00 A0-00 00 32 00 32 00 67 22 0000...................

il che conferma che quanto ho detto è vero. (Infatti nell'elenco dei numeri i primi due sono 78 e 03. Che sono memorizzatti in ordine inverso. Invertendoli ottengo l'indirizzo 0378.)

Ora, oppurato che nella locazione 0000:408 c'è il valore 78, voglio leggere tale valore mediante comandi assembler. Per fare questo scrivo:

mov dx, 0408 in al, dx

ma in al non ottengo il valore 78 ma il valore FF. Cosa sbaglio?

Reply to
Paky

Forse mi sono espresso male. All'indirizzo 0000x408 è contenuta la locazione di memoria della porta lpt1 (ovvero è contenuto il valore 0000x0378) quando (usando debug) scrivo il comando d 0:408 (che consente di visualizzare i dati contenuti in detta locazione) ottengo:

0000:0400 78 03 00 00 00 00 26 03 0000:0410 27 D4 00 80 02 00 00 A0-00 00 32 00 32 00 67 22 0000...................

il che conferma che quanto ho detto è vero. (Infatti nell'elenco dei numeri i primi due sono 78 e 03. Che sono memorizzatti in ordine inverso. Invertendoli ottengo l'indirizzo 0378.)

Ora, oppurato che nella locazione 0000:408 c'è il valore 78, voglio leggere tale valore mediante comandi assembler. Per fare questo scrivo:

mov dx, 0408 in al, dx

ma in al non ottengo il valore 78 ma il valore FF.

Cosa sbaglio?

"Paky" ha scritto nel messaggio news:ZCXab.331705$ snipped-for-privacy@twister1.libero.it...

le

è

impostando

Reply to
Paky

Forse mi sono espresso male. All'indirizzo 0000x408 è contenuta la locazione di memoria della porta lpt1 (ovvero è contenuto il valore 0000x0378) quando (usando debug) scrivo il comando d 0:408 (che consente di visualizzare i dati contenuti in detta locazione) ottengo:

0000:0400 78 03 00 00 00 00 26 03 0000:0410 27 D4 00 80 02 00 00 A0-00 00 32 00 32 00 67 22 0000...................

il che conferma che quanto ho detto è vero. (Infatti nell'elenco dei numeri i primi due sono 78 e 03. Che sono memorizzatti in ordine inverso. Invertendoli ottengo l'indirizzo 0378.)

Ora, oppurato che nella locazione 0000:408 c'è il valore 78, voglio leggere tale valore mediante comandi assembler. Per fare questo scrivo:

mov dx, 0408 in al, dx

ma in al non ottengo il valore 78 ma il valore FF.

Cosa sbaglio?

"Allen" ha scritto nel messaggio news:Xns93FCF2E2FF254all123en@id98127634...

parallela..

Reply to
Paky

Forse mi sono espresso male. All'indirizzo 0000x408 è contenuta la locazione di memoria della porta lpt1 (ovvero è contenuto il valore 0000x0378) quando (usando debug) scrivo il comando d 0:408 (che consente di visualizzare i dati contenuti in detta locazione) ottengo:

0000:0400 78 03 00 00 00 00 26 03 0000:0410 27 D4 00 80 02 00 00 A0-00 00 32 00 32 00 67 22 0000...................

il che conferma che quanto ho detto è vero. (Infatti nell'elenco dei numeri i primi due sono 78 e 03. Che sono memorizzatti in ordine inverso. Invertendoli ottengo l'indirizzo 0378.)

Ora, oppurato che nella locazione 0000:408 c'è il valore 78, voglio leggere tale valore mediante comandi assembler. Per fare questo scrivo:

mov dx, 0408 in al, dx

ma in al non ottengo il valore 78 ma il valore FF.

Cosa sbaglio?

"Paky" ha scritto nel messaggio news:ZCXab.331705$ snipped-for-privacy@twister1.libero.it...

le

è

impostando

Reply to
Paky

Forse mi sono espresso male. All'indirizzo 0000x408 è contenuta la locazione di memoria della porta lpt1 (ovvero è contenuto il valore 0000x0378) quando (usando debug) scrivo il comando d 0:408 (che consente di visualizzare i dati contenuti in detta locazione) ottengo:

0000:0400 78 03 00 00 00 00 26 03 0000:0410 27 D4 00 80 02 00 00 A0-00 00 32 00 32 00 67 22 0000...................

il che conferma che quanto ho detto è vero. (Infatti nell'elenco dei numeri i primi due sono 78 e 03. Che sono memorizzatti in ordine inverso. Invertendoli ottengo l'indirizzo 0378.)

Ora, oppurato che nella locazione 0000:408 c'è il valore 78, voglio leggere tale valore mediante comandi assembler. Per fare questo scrivo:

mov dx, 0408 in al, dx

ma in al non ottengo il valore 78 ma il valore FF.

Cosa sbaglio?

"Allen" ha scritto nel messaggio news:Xns93FCF2E2FF254all123en@id98127634...

parallela..

Reply to
Paky

Mi sono espresso male.

All'indirizzo 0000x408 è contenuta la locazione di memoria della porta lpt1 (ovvero è contenuto il valore 0000x0378) quando (usando debug. Per usare dubug digita al prompt del dos Debug) scrivo il comando d 0:408 (che consente di visualizzare i dati contenuti in detta locazione) ottengo:

0000:0400 78 03 00 00 00 00 26 03 0000:0410 27 D4 00 80 02 00 00 A0-00 00 32 00 32 00 67 22 0000...................

il che conferma che quanto ho detto è vero. (Infatti nell'elenco dei numeri che appaion i primi due sono 78 e 03. Per motivi interni al calcolatore, sono memorizzatti in ordine inverso. Invertendoli ottengo l'indirizzo 0378 come mi aspettavo.)

Ora, oppurato che nella locazione 0000:0408 c'è il valore 78, voglio leggere tale valore mediante comandi assembler.

Per fare questo scrivo:

mov dx, 0408 in al, dx

ma in al non ottengo il valore 78 ma il valore FF.

Cosa sbaglio?

Ho anche provato a scrive:

mov ax, 0 mov dx, ax mov dx, 0408 in al, dx

Per fare in modo che il puntatore al segmento dati (DS) punti al segmento

0000.

"Allen" ha scritto nel messaggio news:Xns93FCF2E2FF254all123en@id98127634...

parallela..

Reply to
Paky

Mi sono espresso male.

All'indirizzo 0000x408 è contenuta la locazione di memoria della porta lpt1 (ovvero è contenuto il valore 0000x0378) quando (usando debug. Per usare dubug digita al prompt del dos Debug) scrivo il comando d 0:408 (che consente di visualizzare i dati contenuti in detta locazione) ottengo:

0000:0400 78 03 00 00 00 00 26 03 0000:0410 27 D4 00 80 02 00 00 A0-00 00 32 00 32 00 67 22 0000...................

il che conferma che quanto ho detto è vero. (Infatti nell'elenco dei numeri che appaion i primi due sono 78 e 03. Per motivi interni al calcolatore, sono memorizzatti in ordine inverso. Invertendoli ottengo l'indirizzo 0378 come mi aspettavo.)

Ora, oppurato che nella locazione 0000:0408 c'è il valore 78, voglio leggere tale valore mediante comandi assembler.

Per fare questo scrivo:

mov dx, 0408 in al, dx

ma in al non ottengo il valore 78 ma il valore FF.

Cosa sbaglio?

Ho anche provato a scrive:

mov ax, 0 mov dx, ax mov dx, 0408 in al, dx

Per fare in modo che il puntatore al segmento dati (DS) punti al segmento

0000.

"Allen" ha scritto nel messaggio news:Xns93FCF2E2FF254all123en@id98127634...

parallela..

Reply to
Paky

Così leggi l'indirizzo di I/O 408 in base decimale, e non l'indirizzo di memoria 408h (in base esadecimale)

Per leggere la memoria 0000:0408, seguendo il tuo esempio,

mov ds,0 mov dx,0408h mov al,[dx]

Per leggere la porta

mov dx,0378h in al,[dx]

e in QBasic o GWBasic

Lettura = INP(&h378)

Attento alle notazioni:

ssss:aaaa indirizzamento memoria al segmento ssss con offset aaaa, sempre espresso in base esadecimale

0x0000 numero in base esadecimale in C 0000h numero in base esadecimale in assembly &h0000 numero in base esadecimale in basic 0000 numero in base decimale in tutti i linguaggi (per default)

Ovviamente il PC deve essere avviato in DOS. Nelle finestre DOS funziona sino a Win95, no in WinMe, NT, 2k, Xp.

Un po' di confusione nella distinzione tra spazi di I/O e di memoria e nelle annotazioni.

Ciao.

lucky

--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG
Reply to
lucky

Anche se ti sei espresso male io comunque ho capito e ti ho dato la risposta.

Ma:

1) non si puo' scrivere in asm maccheronico

2) Quando si programma in asm c'e una sintassi da tener sempre presente, e non puoi ignorare.

3) Non serve postare il MSG ben 7 VOLTE!!!

4) Non serve ripostare il msg con lo stesso contenuto quanto ti si e' gia' postata la soluzione, perche' significa o mi stai prendendo in giro o non capisci il linguaggio che stai usando o che non stai leggendo quello che ti vien risposto e la cosa e' ben peggiore di non capire o di prendere in giro.

5) Studia meglio l'asm ti stai complicando cose semplici.
Reply to
Allen

I miei complimenti, poi che fai lavori solo nel segmento ES? A parte la sintassi discutibile, ma si vede che usi un compilatore dalla bocca buona, poi de metti a DS a 0 e se il programma deve elaborare qualche segmento di store dove lo mette? magari in 0:0 vero? Cosi' facciamo fuori tutta la tabella degli interrupt? Sai almeno perche' si usa il segmento 40:x per leggere come sono allocate le porte di sistema invece di 0:4xx? Il push e i pop li hanno inventati per complicare la programmazione?

Poniamo un po' di attenzione per favore!!!

L'asm non e' un linguaggio tipo basic o Vb che ti puoi dimenticare il 50% delle cose tanto il programma funziona. E se si danno suggerimenti si danno corretti, gia' il tipo non distingue numeri assoluti da locazioni di memoria se comnincia suggerirgli sintassi scorrette rischia di piallarsi il So in 3 secondi netti.

Reply to
Allen

"Paky" wrote in news:e_gbb.334337$ snipped-for-privacy@twister1.libero.it:

dx= XXXXXX , mov dx,0408 , dx=0408 in al, dx --> legge la porta 408 e carica il valore letto in al. Perciò non ha letto la 378 ma la 408.

L'indirizzamento indiretto.

mov dx,[408] (carica in dx il _contenuto_ della locazione 408)

per avere qualcosa che funziona (codice testato) devi fare :

------------ mov ax,0 mov ds,ax

(punta il data segment a 0000)

mov dx,[408] (carica in dx il _contenuto_ della locazione 0000:0408, cioè 0x378)

in al, dx (legge la porta puntata da dx, cioè la 0x378, e carica il valore in al).

-------------

NB: La conoscenza dell'architettura della LPT suppongo sia nota.

AleX

Reply to
AleX

Lavoro con l'assembly intel e zylog dal 1981 e ho scritto interi sistemi operativi stand-alone, oltre che tsr, dll e driver per l'ambiente dos e win. Se dovevo fare un trattato sull'assembly l'avrei fatto. Dovendo solo indicare le istruzioni necessarie ad un particolare scopo in un particolare contesto, ho fatto quello. E pur non essendo la via più concisa mi sono attenuto allo schema di esempio della domanda.

Se la sai più lunga esprimi il tuo sapere, ma contieni i giudizi sulle risposte di altre conosci solo da un post.

Sulle tue convinzioni circa il registro ds ti dico la mia, che non necessariamente esclude la tua. Qualsiasi valore metti in ds ti consente di zappare 64K ram. Poco importa se ti ritrovi raggiungibile la tabella degli interrupt o no, se scrivi la locazione sbaglata prima o poi la paghi. Tanto vale stare sempre attenti, senza confidare su valori più 'sicuri' che comunque non garantiscono l'infallibilità. In ogni caso non ho capito tu, lasciando ds come si trova, che cosa _speri_ di leggere. Forse dovresti porre "un po' di attenzione" ...

Sull'uso di pop e push, la questione esula dal contesto. Se necessari, ma in quel contesto (debug di dos) non lo sono, si sarebbe prima dovuto parlare di sp e di ss.

Sulla sintassi ognuno preferirebbe la sua, frutto di mediazione tra tanti compilatori, ma è costretto ad adattarsi a quella del compilatori del momento. Non per niente i compilatori prevedono una compatibilità di sintassi. Se qualcosa ti sembra _sbagliato_, dimmelo.

lucky

--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG
Reply to
lucky

E' ovvio che non sono un professionista sono anni che non programmo in assem altrimenti non stavo a perdere i punti con te. A parte questo conosco bene l'esistenza delle istruzioni di pop e push che inserisco nei miei codici. Ho solo sintetizzato il probloma.

Un po di elasticità.

"Allen" ha scritto nel messaggio news:Xns93FDE4009AF2Dall123en@id98127634...

qualche

40:x

danno

memoria

3
Reply to
Paky

Allen. dx= XXXXXX , mov dx,0408 , dx=0408 in al, dx --> legge la porta 408 e carica il valore letto in al. Perciò non ha letto la 378 ma la 408.

allora non hai capito niente non voglio leggere la locazione 378 ma la 408 che contiene il valore 378..... ma con te si perde tempo. leggi bene. Puoi capire quanto vui l'assembler ma l'italiano ........

Ringrazio luky per la dritta. E mi scuso con le persone serie per i numerosi messaggi uguali ma domenica al server del mio paese ci sono stati problemi.

Reply to
Paky

"Paky" ha scritto nel messaggio news:ZLgbb.334308$ snipped-for-privacy@twister1.libero.it...

leggere

Sbagli un po' di cose... Con in al,dx non leggi la memoria ma il port di i/o all'indirizzo dx, in questo caso leggi il port 408. Per leggere la memoria puoi fare mov ax,[408h] e in questo modo leggi il valore a 16 bit contenuto in 408h e 409h. Pero' prima devi settare il segment register DS a 0. La stessa cosa, piu' correttamente puoi farla ponendo DS=40h e leggendo il dato a [8]. Comunque ci sono molti modi per accedere ad un dato in memoria, dipende anche dal sistema operativo che usi, dal linguaggio, dal modello di memoria, dal modo di funzionamento della cpu, ecc. Come ti hanno gia' detto, ti conviene studiare un po' l'architettura delle cpu x86 e l'assembler.

Reply to
Valeria Dal Monte

Non ti riesce proprio di dimostrare la tua sapienza senza denigrare gli altri, eh?

lucky

--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG
Reply to
lucky

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.