|
|
|
![]() |
|
Strumenti |
![]() |
#41 | |
Bannato
Iscritto dal: Jan 2009
Messaggi: 194
|
Quote:
altrimenti e' sufficente l'offset.. La CPU in modo x86 vede la memoria in questo modo : 0000:0001 AB 0000:0002 1A 0000:0003 E3 dove il primo numero di 4 cifre esadecimale e' il registro di segmento CS (code segment) il secondo numero di 4 cifre hexadecimal e' il registro di offset IP (instruction pointer) e il terzo numero e' il dato in memoria a 8 bit. Segment + Offset determinano l'indirizzo fisico delle 20 linee di memoria della CPU 8086 (con sovrapposizione delle aree di segmento x i noti probblemi... ) In pratica occorre cambiare segmento se si oltrepassano i 64k di memoria.. oppure se bisogna indirizzare delle aree fuori i 64k del codice.. In particolare i file eseguibili *.com del dos erano tutti intrasegmento, quindi non era possibile utilizzare piu' di 64k per eseguibili piu' grandi si utilizzavano gli *.exe.. bye ![]() |
|
![]() |
![]() |
![]() |
#42 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Non è esatto. Anche coi COM era possibile utilizzare più di 64KB.
Per il codice si utilizza la tecnica dell'overlay. Per i dati... si allocavano richiamando le funzioni del DOS. ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#43 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
|
|
![]() |
![]() |
![]() |
#44 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Come ho già scritto poco sopra, è possibile invece.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#45 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
|
![]() |
![]() |
![]() |
#46 | |
Bannato
Iscritto dal: Jan 2009
Messaggi: 194
|
Quote:
![]() http://en.wikipedia.org/wiki/COM_file "The COM format is the original binary executable format used in CP/M and MS-DOS. It is very simple; it has no header, and contains no metadata, only code and data. Its simplicity exacts a price, however: the binary has a maximum size of 65,280 (0xFF00) bytes (a little bit less than 64 KiB) and stores all its code and data in one segment." poi volendo avevi anche la libberta' di fare come ti pare.. ![]() "In the .COM system, larger programs (up to the available memory size) can be loaded and run, but the system loader assumes that all code and data is in the first segment, and it is up to the .COM program to provide any further organization." |
|
![]() |
![]() |
![]() |
#47 | |
Bannato
Iscritto dal: Jan 2009
Messaggi: 194
|
Quote:
tipo JMP 00AA:0011 (intersegmento diretto opcode "EA") Ma c'e' il rischio di fare un salto nel buio.. e facilmente si va' a pescare un opcode che blocca la cpu.. ![]() oppure si puo' saltare in un area sovrapposta.. JMP B004:000A = elettrico B004A JMP B003:001A = elettrico B004A JMP B002:002A = elettrico B004A in modo 8086 compatibile sono tutti salti alla stessa locazione di memoria... in questo caso e' facile cambiare CS e IP all' interno di un piccolo programma. Ultima modifica di StateCity : 25-04-2009 alle 21:26. |
|
![]() |
![]() |
![]() |
#48 | |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
![]() Grazie per la conferma. ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
![]() |
![]() |
![]() |
#49 |
Bannato
Iscritto dal: Jan 2009
Messaggi: 194
|
anche se nn hai raggione,
se avessi una ragazza che mi sta' appresso come te' sarei il maschio il piu' felice del mondo.. ![]() ciao caro ![]() Ultima modifica di StateCity : 25-04-2009 alle 21:30. |
![]() |
![]() |
![]() |
#50 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
da chi viene variato il registro DS ? |
|
![]() |
![]() |
![]() |
#51 |
Bannato
Iscritto dal: Jan 2009
Messaggi: 194
|
http://www.itipedia.org/images/f/fa/8086.pdf
http://www.ece.unm.edu/faculty/jimp/...es/assem3.html http://www.cad.polito.it/~sonza/05ch...e/ASSEM_01.pdf http://www.ing.unife.it/elettr/CE/8086Asm02-03.pdf tutti documenti molto utili.. ![]() basta sgooglare "assembler 8086" non assembly ![]() altrimenti nun se trova nulla.. ![]() Ultima modifica di StateCity : 25-04-2009 alle 22:38. |
![]() |
![]() |
![]() |
#52 |
Bannato
Iscritto dal: Jan 2009
Messaggi: 194
|
una session di debug dos...
Codice:
0D03:0100 B80B0A mov ax,0A0B 0D03:0103 8ED8 mov es,ax 0D03:0105 8EC0 mov ds,ax 0D03:0107 90 nop 0D03:0109 90 nop |
![]() |
![]() |
![]() |
#53 | |||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
![]() Tornando a noi: Quote:
Quote:
![]() ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|||
![]() |
![]() |
![]() |
#54 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
preso da qui Data segment (DS) is a 16-bit register containing address of 64KB segment with program data. By default, the processor assumes that all data referenced by general registers (AX, BX, CX, DX) and index register (SI, DI) is located in the data segment. DS register can be changed directly using POP and LDS instructions. E' il registro che contiene l'indirizzo dei vari segmenti di dimensioni di 64KB e tali segmenti contengono i dati usati e quindi caricati nei registri (AX, BX, CX, DX) ed i registri indice (SI, DI). La parte in grassetto dice che DS può essere cambiato direttamente dal programmatore quindi usando opportune istruzioni: quindi far puntare i registri (AX, BX, CX, DX) e (SI, DI) è compito del programmatore assembly e non è un automatismo della cpu come contrariamente credevo. ![]() |
|
![]() |
![]() |
![]() |
#55 | |
Bannato
Iscritto dal: Jan 2009
Messaggi: 194
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#56 | |
Bannato
Iscritto dal: Jan 2009
Messaggi: 194
|
Quote:
che nn poteva indirizzare piu' di 64k ecco che e' rimasto il limite del segmento... ![]() il supero della capacita' e' stato dato solo dalle facilitazioni del dos.. come la memoria maggiore di un mega in modo 8086 del 386 ![]() |
|
![]() |
![]() |
![]() |
#57 | |
Bannato
Iscritto dal: Jan 2009
Messaggi: 194
|
Quote:
quando si puo' fare direttamente con mov ds,ax.. forse si risparmia qualche ciclo di clock.. ![]() il segmento ds e' implicito se si scrive : 0000:0100 8B04 mov ax,[si] la cpu prende implicitamente il segmento DS per formare l'indirizzo in memoria DS:SI altrimenti si deve specificare direttamente.. 0000:0102 368B04 mov ax,[ss:si] (si nota che 36hex e' il prefisso di segmento.. ) e in debug verrebbe scritto solo cosi' : 0000:0102 36 ss: 0000:0103 8B04 mov ax,[si] essedo il resto dell'opcode uguale al primo sopra.. ![]() in questo caso e' l'indirizzo e' formato da SS:SI Questo si studia nei 7 modi di indirizzamento delle cpu 8086.. du ![]() ![]() ma sono sicuro che cdimauro avra' qualcosa da ridire.. ![]() Ultima modifica di StateCity : 26-04-2009 alle 16:07. |
|
![]() |
![]() |
![]() |
#58 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
però non hai risposto alla mia domanda e cioè se è il programmatore a variare l'indirizzo contenuto in DS. Mi chiedo anche come fa la CPU a leggere all'indirizzo DS nel senso che, ho capito che tale indirizzo viene usato dai registri AX, etc.. ma come avviene l'incremento per puntare al prossimo dato per la prossima istruzione ? |
|
![]() |
![]() |
![]() |
#59 |
Bannato
Iscritto dal: Jan 2009
Messaggi: 194
|
cmq. dipende anche dalla variabile puntatore...
MOV ax,[si] utilizza DS come segmento implicito (se non diversamente specificato nel prefisso) MOV ax,[bp] utilizza SS come segmento implicito (se non diversamente specificato nel prefisso) In ogni caso il programma *.com prevede che tutto sia dentro i 64k quindi assume che CS=ES=SS=DS.. e allora non c'e' necessita' di specificare valori diversi per il segmento. se si volesse scirvere/leggere in un area di memoria esterna ai 64k si possono comunque cambiare i valori del registro DS MOV AX, B000 (carica in AX il valore B000) MOV DS,AX (carica in DS il valore di AX) MOV AX,[SI] (carica in AX il valore della memoria B000:SI ) con LDS si dovrebbe prima scrivere il valore di DS in area memoria dati, e poi richiamare la funzione LDS che assieme a DS carica pure l'operando destinazione.. ![]() IMHO.. ![]() |
![]() |
![]() |
![]() |
#60 | |
Bannato
Iscritto dal: Jan 2009
Messaggi: 194
|
Quote:
e IP viene incrementato automaticamente alla frequenza di clock.. ![]() x Gli altri registri e' compito del sistema operativo dare i valori iniziali per il programma.. in modo che non vadano ad interferire con altri processi della cpu ![]() Ultima modifica di StateCity : 26-04-2009 alle 16:40. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:48.