View Full Version : Assembler 8086
[NoS]-roby87
12-12-2005, 10:43
salve
qualcuno è pratico di assembler 8086??
mi servirebbe una mano.
ecco la traccia dell'esercizio:
dato un valore generico nel registro AL confrontarlo con ogni valore che si trova tra gli indirizzi 0100 e 0110.
se trova un valore uguale visualizza sullo schermo il valore 1 altrimenti visualizza 0.
aiutatemi ci sto lavorando da un paio di giorni e non sono riuscito a risolverlo.
come assemblatore-amulatore ho Emu8086 v3.05.
grazie a tutti anticipatamente. ciao
-roby87']salve
qualcuno è pratico di assembler 8086??
mi servirebbe una mano.
ecco la traccia dell'esercizio:
dato un valore generico nel registro AL confrontarlo con ogni valore che si trova tra gli indirizzi 0100 e 0110.
se trova un valore uguale visualizza sullo schermo il valore 1 altrimenti visualizza 0.
aiutatemi ci sto lavorando da un paio di giorni e non sono riuscito a risolverlo.
come assemblatore-amulatore ho Emu8086 v3.05.
grazie a tutti anticipatamente. ciao
Ciao, premesso che è parecchio tempo che non scrivo 1 riga di assembly per gli x86 :cry: (comunque ho tutto un background sui microprocessori e l'assembly in generale :) ), posso provare ad aiutarti io.
Intanto, per cominciare, dovresti dire se il tuo programma è a 16 o 32 bit. Cioè se il tuo obiettivo è creare un programma per DOS o per Windows (Win32). Poi dovresti spiegare meglio cosa intendi per indirizzi 0100 e 0110. Che razza di indirizzi sono?? :confused:
Vuoi accedere ad indirizzi assoluti o ad una qualche area di memoria che definisci tu da qualche parte nel tuo programma??
P.S.: Il Emu8086 non lo conosco, io una volta usavo TASM/TLINK della Borland. Ho fatto una veloce ricerca con google ed ho trovato il sito di questo software. Sembra però che lo si possa solo acquistare, cioè non ho trovato un punto da cui poterlo scaricare. :(
-roby87']salve
qualcuno è pratico di assembler 8086?? io abbastanza, ma dipende anche dalla modalità :Prrr:
mi servirebbe una mano.
ecco la traccia dell'esercizio:
dato un valore generico nel registro AL confrontarlo con ogni valore che si trova tra gli indirizzi 0100 e 0110.
se trova un valore uguale visualizza sullo schermo il valore 1 altrimenti visualizza 0.
aiutatemi ci sto lavorando da un paio di giorni e non sono riuscito a risolverlo. gli indirizzi che hai scritto sono assurdi: a parte che non ho capito se sono in binario o in base 10, in modalità reale (o virtuale 86) fanno riferimento alla IDT... se questo che ho scritto (non testato) può esserti utile:
; assumo che quegli indirizzi assurdi fossero in base 10...
; anche perché non ho mai visto un indirizzo espresso in base 2 ^^
mov cx,10 ; 110 - 100
xor dx,dx
mov es,dx
mov dx,100
mov di,dx
repe scasb ; mi ricorda qualcuno :D
je _print1
_print0:
mov al,'0'
jmp _exit
_print1:
mov al,'1'
_exit:
mov ah,0ah
xor bh,bh
mov cx,1
int 10h
come assemblatore-amulatore ho Emu8086 v3.05.
grazie a tutti anticipatamente. ciao ROTFL!!! :D
ma perché scusa, tu usi un emulatore x86 su x86?? :rotfl:
[NoS]-roby87
12-12-2005, 12:46
allora il prof mi ha detto che quast'area di memoria è esadecimale
e nell'emulatore parte a 0100h.
il problema che non capisco è che non sò le istruzioni di come prendere un valore in questo intervallo di indirizzi e metterli nel registro BL.
capito?
un'altro problema è che quando voglio passare al prossimo indirizzo (dovrei incrementarlo di uno) uso o INC CL (CL registro dove carico i vari indirizzi e non i loro valori) o ADD CL,01h.
se non vi e chiaro ecco il programma che sto abbozzando:
#make_COM#
; COM file is loaded at CS:0100h
ORG 100h
MOV CL,00FFh
sopra: MOV DL,48d
MOV AH,02h
INT 21h
ADD CL,01h
CMP CL,[0111]
JE fine
MOV BL,CL
CMP AL,BL
JNE sopra
MOV DL,49d
MOV AH,02h
INT 21h
CMP CL,[0111]
JNE sopra
fine: HLT
per quanto riguarda l'emulatore datemi i vostri indirizzi MSN e ve lo passo volentieri :D :D
ciao
-roby87']allora il prof mi ha detto che quast'area di memoria è esadecimale
e nell'emulatore parte a 0100h. ---___---'''
non sono indirizzi, sono offset... -.-'
il problema che non capisco è che non sò le istruzioni di come prendere un valore in questo intervallo di indirizzi e metterli nel registro BL.
capito? un'altro problema è che quando voglio passare al prossimo indirizzo (dovrei incrementarlo di uno) uso o INC CL (CL registro dove carico i vari indirizzi e non i loro valori) o ADD CL,01h. guardati la documentazione dell'istruzione REPE SCASB (lol :D)
per quanto riguarda l'emulatore datemi i vostri indirizzi MSN e ve lo passo volentieri :D :D scusa... non ho capito una cosa... come mai usi un emulatore che emula la stessa piattaforma su cui lavori? :D
oppure lavori su mac? :asd:
gli indirizzi che hai scritto sono assurdi: a parte che non ho capito se sono in binario o in base 10, in modalità reale (o virtuale 86) fanno riferimento alla IDT... Dallo 0 davanti io direi che li intendeva in binario ... ma tanto non hanno molto senso lo stesso ;)
ma perché scusa, tu usi un emulatore x86 su x86?? :rotfl:Non conosco 'sto Emu8086, potrebbe essere una specie di simulatore o qualcosa del genere ... dai, non mi dire che in ambito didattico sarebbe una cosa così orribile ;)
[NoS]-roby87
12-12-2005, 12:59
---___---'''
non sono indirizzi, sono offset... -.-'
ah ok grazie
guardati la documentazione dell'istruzione REPE SCASB (lol :D)
??? non la conosco; non esiste qualcosa di più semplice??
scusa... non ho capito una cosa... come mai usi un emulatore che emula la stessa piattaforma su cui lavori? :D
oppure lavori su mac? :asd:
no.
non emula la piattaforma stessa ma emula il processore 8086.
Non conosco 'sto Emu8086, potrebbe essere una specie di simulatore o qualcosa del genere ... dai, non mi dire che in ambito didattico sarebbe una cosa così orribile ;) ma no che non lo è, è come tentare di mantenere qualcosa a temperatura media mettendola dentro un forno e mettendo il forno in un surgelatore :D
[NoS]-roby87
12-12-2005, 13:06
raga non è che potete dare un occhiata al programma che messo prima???
verificate ce c'è qualche errore tramite il mio emulatore.
non avete un email hotmail???
[NoS]-roby87
12-12-2005, 13:09
71104 connettiti a hotmail che ti passo l'emulatore
-roby87']??? non la conosco; non esiste qualcosa di più semplice?? no :Prrr:
repe scasb è semplicissima, basta che gli riempi tutti i registri e lei ti fa tutto; può essere che ho sbagliato e che invece che repe scasb devi usare (LOL!! :D) repne scasb, comunque è quel tipo di istruzioni là che devi guardare imho.
no.
non emula la piattaforma stessa ma emula il processore 8086. e tu non lavori su un sovrainsieme dell'8086...?
PS: ho visto che mi hai aggiunto alla contact list: scusa se non ti do retta ma devo andare a lezione ^^
ci sentiamo casomai stasera ;)
ciao
-roby87']allora il prof mi ha detto che quast'area di memoria è esadecimale e nell'emulatore parte a 0100h.Ah, ok. Pensavo li intendessi in binario! Quelli comunque sono offset. Ricordati sempre che l'acca finale è importante!
-roby87']il problema che non capisco è che non sò le istruzioni di come prendere un valore in questo intervallo di indirizzi e metterli nel registro BL.
capito?
un'altro problema è che quando voglio passare al prossimo indirizzo (dovrei incrementarlo di uno) uso o INC CL (CL registro dove carico i vari indirizzi e non i loro valori) o ADD CL,01h.Allora ... il registro CL (di 8 bit) non è assolutamente adatto per memorizzare un indirizzo ;) . Se non sono troppo "arrugginito" e mi ricordo bene, in modalità reale i processori x86 possono usare i registri BX, SI e DI e BP per puntare in memoria.
Quindi potresti fare un qualcosa del tipo:
MOV SI, 0100h
...
MOV BL,[SI]
INC SI
E ricordati che i processori x86 (parlo in modo specifico per la modalità reale), hanno la memoria "segmentata". L'indirizzo fisico viene formato combinando un segmento con un offset!
[NoS]-roby87
12-12-2005, 14:49
Ah, ok. Pensavo li intendessi in binario! Quelli comunque sono offset. Ricordati sempre che l'acca finale è importante!
Allora ... il registro CL (di 8 bit) non è assolutamente adatto per memorizzare un indirizzo ;) . Se non sono troppo "arrugginito" e mi ricordo bene, in modalità reale i processori x86 possono usare i registri BX, SI e DI e BP per puntare in memoria.
Quindi potresti fare un qualcosa del tipo:
MOV SI, 0100h
...
MOV BL,[SI]
INC SI
E ricordati che i processori x86 (parlo in modo specifico per la modalità reale), hanno la memoria "segmentata". L'indirizzo fisico viene formato combinando un segmento con un offset!
quindi il mio prog diventerebbe così:
MOV SI,00FFh
sopra: MOV DL,48d
MOV AH,02h
INT 21h
INC SI
CMP SI,0111h
JE fine
MOV BL,[SI]
CMP AL,BL
JNE sopra
MOV DL,49d
MOV AH,02h
INT 21h
CMP SI,0111h
JNE sopra
fine: HLT
l'ho provato
però dovrei apportare delle modifiche:
-all'inizio se vedi bene mi visualizza sicuramente uno 0 poichè è sequanziale la decodifica del prog.
-mi segna anche alla fine un'altro 0.
calcolando tutte le allocazioni di memoria di offset ne risultano 17 (correggimi se sbaglio) quindi mi dovrebbe visualizzare 17 tra zero e uno; e invece me ne visualizza 19.
come lo risolvo???
[NoS]-roby87
12-12-2005, 14:53
inoltre mi visualizza sempre la stessa sequenza di zero e uno:
0000010000000000000
è normale o dovrebbe cambiare???
stavo pensando poi, ma in questi indirizzi i valori variano da pc a pc?? o sono già predefiniti per tutti dall'emulatore??
[NoS]-roby87
12-12-2005, 14:56
inoltre (scusami se ti bombardo di domande) quando avvio l'emulkatore e immetto nel registro AL un valore, dopo mi altera tutto poichè viene cambiato durante l'esecuzione del prog.
cosa mi consigli di fare????
ciao
-roby87']l'ho provato
però dovrei apportare delle modifiche:
-all'inizio se vedi bene mi visualizza sicuramente uno 0 poichè è sequanziale la decodifica del prog.
-mi segna anche alla fine un'altro 0.
calcolando tutte le allocazioni di memoria di offset ne risultano 17 (correggimi se sbaglio) quindi mi dovrebbe visualizzare 17 tra zero e uno; e invece me ne visualizza 19.
come lo risolvo???Il codice mi sembra già meglio rispetto a quello di prima. Mi permetto però di riscriverlo così come lo farei io e poi ti spiego:
MOV SI,0100h
ciclo:
CMP SI,0111h
JE fine
MOV DL,48
CMP AL,[SI]
JNE stampa
INC DL
stampa:
MOV AH,02h
INT 21h
INC SI
JMP ciclo
fine:
HLT
Il nocciolo è il blocco:
MOV DL,48
CMP AL,[SI]
JNE stampa
INC DL
Metto subito DL a 48 ('0') e poi confronto il valore. Quindi se non è uguale vado a stampa e stampo '0' altrimenti incremento DL (49) e stampo '1'.
Molto lineare no?
-roby87']inoltre mi visualizza sempre la stessa sequenza di zero e uno:
0000010000000000000
è normale o dovrebbe cambiare???
stavo pensando poi, ma in questi indirizzi i valori variano da pc a pc?? o sono già predefiniti per tutti dall'emulatore??
Nel tuo primo codice avevi indicato ORG 100h quindi il codice parte dall'offset 0100h. Se metti SI a 0100h e ammesso che il data segment (DS) sia uguale al code segment (CS) (non so come imposta i segmenti il tuo emulatore, eh!, ma presuppongo che sia così), tu in pratica stai andando a leggere il ... tuo codice, cioè i byte che compongono il tuo programma.
-roby87']inoltre (scusami se ti bombardo di domande) quando avvio l'emulkatore e immetto nel registro AL un valore, dopo mi altera tutto poichè viene cambiato durante l'esecuzione del prog.
cosa mi consigli di fare????
ciao
Già è vero, quando ti ho riscritto il codice non ci ho pensato (l'ho detto che sono un po' arrugginito ;) ) ma in effetti il registro AL viene sicuramente modificato dall'INT 21h.
Quando si invocano questi interrupt bisogna sempre fare un po' di attenzione perché alcuni registri vengono certamente alterati. È il caso del registro AL e/o AH che in genere contengono un valore o codice di errore restituito dall INT chiamato.
Una soluzione sarebbe quella di fare un PUSH AX prima dell'INT 21h e un POP AX dopo. Così ti salvi il registro AX.
DanieleC88
12-12-2005, 16:30
ma no che non lo è, è come tentare di mantenere qualcosa a temperatura media mettendola dentro un forno e mettendo il forno in un surgelatore :D
LOL ma che esempio! :D :rotfl: :D
[NoS]-roby87
12-12-2005, 16:44
Già è vero, quando ti ho riscritto il codice non ci ho pensato (l'ho detto che sono un po' arrugginito ;) ) ma in effetti il registro AL viene sicuramente modificato dall'INT 21h.
Quando si invocano questi interrupt bisogna sempre fare un po' di attenzione perché alcuni registri vengono certamente alterati. È il caso del registro AL e/o AH che in genere contengono un valore o codice di errore restituito dall INT chiamato.
Una soluzione sarebbe quella di fare un PUSH AX prima dell'INT 21h e un POP AX dopo. Così ti salvi il registro AX.
grazie mille per quello che hai fatto.
non sei affatto arrugginito anzi.. :sofico: :sofico:
cmq ho risolto:
ho visto quale registro non veniva alterato e l'ho sostituito con AL.
l'ho sostituito con BL.
ciao
caso mai qualche altro ingrippo ti chiamo. :D :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.