Advertisement
Guest User

Untitled

a guest
Jul 2nd, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 30.49 KB | None | 0 0
  1.  MRS SPORTHomeCome guadagnareRegistratiFAQGallerieContattiLast Minute Username:Password:Password dimenticata?Ti trovi in: Home Programmazione Descrizione dettagliata dei registri per Assembly mar
  2. 21metem Descrizione dettagliata dei registri per Assembly
  3.  
  4. Warning: getimagesize() [function.getimagesize]: Filename cannot be empty in /var/www/web2/html/mondoinformatico.info/nuovo/wp-content/plugins/paginated-comments/paginated-comments.php(475) : eval()'d code on line 50
  5.  
  6. REGISTRI
  7.  
  8. <!--[if !supportEmptyParas]--> <!--[endif]-->
  9.  
  10. L’8086 dispone di alcuni elementi di memorizzazione ad alta velocità inseriti nel chip stesso, denominati registri. È possibile pensare ai registri come a locazioni di memoria che l’8086 utilizza con un tempo di accesso inferiore alla memoria tradizionale, ma questa è solo una delle caratteristiche che rendono i registri veramente particolari. Ciascun registro ha una sua propria caratteristica e dispone di particolarità che nessun altro registro o locazione di memoria possiede.
  11.  
  12. <!--[if !supportEmptyParas]--> <!--[endif]-->
  13.  
  14. I registri possono essere classificati in quattro categorie: il registro dei flag, i registri di utilizzo generale, il puntatore alle istruzioni e i registri di segmento.
  15.  
  16. <!--[if !supportEmptyParas]--> <!--[endif]-->
  17.  
  18. Il registro dei flag
  19.  
  20. <!--[if !supportEmptyParas]--> <!--[endif]-->
  21.  
  22. Il registro dei flag è un registro a 16 bit che contiene tutte le informazioni relative allo stato dell’8086 e i risultati delle ultime operazioni.
  23.  
  24. <!--[if !supportEmptyParas]--> <!--[endif]-->
  25.  
  26. Bit Number
  27.  
  28. <!--[if !supportEmptyParas]--> <!--[endif]-->
  29.  
  30. <!--[if !supportEmptyParas]--> <!--[endif]-->
  31. <!--[if !supportEmptyParas]--> <!--[endif]-->
  32. <!--[if !supportEmptyParas]--> <!--[endif]-->
  33. <!--[if !supportEmptyParas]--> <!--[endif]-->
  34. O
  35. D
  36. I
  37. T
  38. S
  39. Z
  40. <!--[if !supportEmptyParas]--> <!--[endif]-->
  41. A
  42. <!--[if !supportEmptyParas]--> <!--[endif]-->
  43. P
  44. <!--[if !supportEmptyParas]--> <!--[endif]-->
  45. C
  46.  
  47.  
  48. <!--[if !supportEmptyParas]--> <!--[endif]-->
  49.  
  50. Flag Bits
  51.  
  52. <!--[if !supportEmptyParas]--> <!--[endif]-->
  53.  
  54. O=Overflow Flag T=Trap Flag A=Auxiliary Carry Flag
  55.  
  56. D=Direction Flag S=Sign Flag P=Parity Flag
  57.  
  58. I=Interrupt Flag Z=Zero Flag C=Carry Flag
  59.  
  60. <!--[if !supportEmptyParas]--> <!--[endif]-->
  61.  
  62. Per esempio, se si desidera sapere se una sottrazione ha prodotto un risultato uguale a zero, è necessario leggere il flag di zero (il bit Z del registro dei flag) immediatamente dopo l’esecuzione dell’operazione; se tale bit ha valore 1, si è ottenuto un risultato uguale a zero. Gli altri flag come il flag di carry e il flag di overflow riportano in maniera analoga i risultati di operazioni aritmetiche e logiche.
  63.  
  64. <!--[if !supportEmptyParas]--> <!--[endif]-->
  65.  
  66. Gli altri flag controllano le modalità delle operazioni dell’8086. Il flag di direzione controlla la direzione di spostamento delle istruzioni che agiscono sulle stringhe, e il flag di interrupt controlla se un dispositivo esterno, come una tastiera o un modem, può interrompere il programma in esecuzione per eseguire funzioni più prioritarie. Il flag di trap viene utilizzato soltanto da programmi che servono per eseguire il debugging di altri programmi.
  67.  
  68. <!--[if !supportEmptyParas]--> <!--[endif]-->
  69.  
  70. Il registro dei flag non viene modificato o letto direttamente. Al contrario, il registro dei flag viene gestito attraverso speciali istruzioni (come CLD, STI e CMC) e mediante alcune istruzioni logiche e aritmetiche che possono modificare alcuni flag. In modo analogo, alcuni bit del registro dei flag influenzano i risultati di alcune istruzioni come JZ, RCR e MOVSB. Il registro dei flag non viene utilizzato per la memorizzazione dei dati, ma è, piuttosto, il sistema per controllare lo stato dell’8086.
  71.  
  72.  
  73.  
  74. <!--[if !supportEmptyParas]--> <!--[endif]-->
  75.  
  76. I registri di utilizzo generale
  77.  
  78. <!--[if !supportEmptyParas]--> <!--[endif]-->
  79.  
  80. Gli otto registri di utilizzo generale dell’8086 (ciascuno di 16 bit) sono coinvolti nell’esecuzione di molte istruzioni, come punto di partenza o di arrivo di dati per le operazioni aritmetiche, come puntatori alla memoria e come contatori. Ciascuno dei registri di utilizzo generale può memorizzare qualsiasi valore a 16 bit, può essere utilizzato per operazioni aritmetiche e logiche. Per esempio, le seguenti istruzioni
  81.  
  82.  
  83. mov ax,5
  84.  
  85. mov dx,9
  86.  
  87. add ax,dx
  88.  
  89.  
  90. caricano il valore 5 in AX, caricano il valore 9 in DX e sommano i due valori, memorizzando il risultato, 14, nel registro AX. CX, SI o qualunque altro registro possono essere utilizzati allo stesso modo e tutti danno il medesimo risultato.
  91.  
  92. <!--[if !supportEmptyParas]--> <!--[endif]-->
  93.  
  94. Tuttavia, oltre alla capacità di memorizzare valori e servire come sorgente e destinazione per le istruzioni che gestiscono dati, ciascuno dei registri di utilizzo generale possiede caratteristiche proprie. Ora vengono illustrati i singoli registri.
  95.  
  96. <!--[if !supportEmptyParas]--> <!--[endif]-->
  97.  
  98. Il registro AX
  99.  
  100. <!--[if !supportEmptyParas]--> <!--[endif]-->
  101.  
  102. Il registro AX viene anche chiamato accumulatore. Viene sempre utilizzato durante le operazioni di moltiplicazione e divisione ed è il registro più efficace nell’utilizzo di alcune operazioni aritmetiche, logiche e di spostamento di dati.
  103.  
  104. <!--[if !supportEmptyParas]--> <!--[endif]-->
  105.  
  106. Gli 8 bit bassi del registro AX vengono chiamati registro AL (per A-Low), e gli 8 bit alti del registro AX vengono chiamati AH (per A-High). Questa distinzione risulta utile nella gestione di valori che sono di tipo byte, poiché è possibile utilizzare il registro AX come due registri separati. Le istruzioni seguenti impostano AH a 0, copiano il valore in AL, quindi sommano 1 al valore di AL:
  107.  
  108.  
  109. mov ah,0
  110.  
  111. mov al,ah
  112.  
  113. inc al
  114.  
  115.  
  116. Come risultato finale, il registro AX vale 1. i registri BX, CX e DX possono essere utilizzati nello stesso modo sia come registri a 16 bit che come registri a 8 bit.
  117.  
  118. <!--[if !supportEmptyParas]--> <!--[endif]-->
  119.  
  120. Il registro BX
  121.  
  122. <!--[if !supportEmptyParas]--> <!--[endif]-->
  123.  
  124. Il registro BX può puntare a locazioni di memoria. Un valore a 16 bit memorizzato in BX può essere utilizzato come parte dell’indirizzo a una locazione di memoria da utilizzare. Per esempio, le seguenti istruzioni caricano il registro AL con il contenuto della locazione di memoria che ha indirizzo 9:
  125.  
  126.  
  127. mov ax,0
  128.  
  129. mov ds,ax
  130.  
  131. mov bx,9
  132.  
  133. mov al,[bx]
  134.  
  135.  
  136. Si noti che è stato caricato nel registro DS il valore 0 (mediante AX) prima di cercare di accedere alla locazione di memoria a cui punta da BX. Ciò dipende dalla natura dei segmenti in cui è suddivisa la memoria dell’8086, come abbiamo precedentemente menzionato. Di norma, quando il registro BX viene utilizzato come puntatore alla memoria, punta all’indirizzo relativo al contenuto del registro di segmento DS.
  137.  
  138. <!--[if !supportEmptyParas]--> <!--[endif]-->
  139.  
  140. Il registro CX
  141.  
  142. <!--[if !supportEmptyParas]--> <!--[endif]-->
  143.  
  144. Il registro CX ha la funzione specifica di contatore. Si supponga di voler ripetere dieci volte un blocco di istruzioni. È possibile eseguire tale operazione con
  145.  
  146.  
  147. mov cx,10
  148.  
  149. BeginningOfLoop
  150.  
  151.  
  152. <istruzioni da ripetere>
  153.  
  154.  
  155. sub cx,1
  156.  
  157. jnz BeginningOfLoop
  158.  
  159.  
  160. In questo breve programma sono presenti istruzioni per il momento sconosciute. Il punto principale è che le istruzioni comprese fra label (etichetta) BeginningOfLoop e l’istruzione JNZ vengono ripetute fino a quando il registro CX non assume il valore 0. Si osservi che le due istruzioni SUB CX,1 e JNZ BeginningOfLoop sono necessarie per decrementare CX e saltare alla label BeginningOfLoop se il valore di CX non ha ancora assunto il valore 0.
  161.  
  162. <!--[if !supportEmptyParas]--> <!--[endif]-->
  163.  
  164. Decrementare un contatore ed eseguire un ciclo è uno dei blocchi di programma più frequenti; quindi l’8086 mette a disposizione una istruzione apposita per rendere i cicli più veloci e il programma più compatto. Naturalmente tale istruzione è stata chiamata LOOP. L’istruzione LOOP sottrae 1 a CX e riesegue il ciclo se il valore di CX non è 0. Le seguenti istruzioni sono equivalenti all’esempio precedente:
  165.  
  166.  
  167. mov cx,10
  168.  
  169. BeginningOfLoop:
  170.  
  171.  
  172. <istruzioni da ripetere>
  173.  
  174.  
  175. loop BeginningOfLoop
  176.  
  177.  
  178. Il registro CX viene utilizzato come contatore e nei cicli.
  179.  
  180. <!--[if !supportEmptyParas]--> <!--[endif]-->
  181.  
  182. Il registro DX
  183.  
  184. <!--[if !supportEmptyParas]--> <!--[endif]-->
  185.  
  186. Il registro DX è l’unico registro che può essere utilizzato come puntatore agli indirizzi di input e output nelle istruzioni IN e OUT. Infatti non esiste alcun modo per indirizzare le porte di I/O da 256 a 65.535 senza utilizzare il registro DX. Per esempio, le seguenti istruzioni scrivono il valore 62 sulla porta di I/O che ha indirizzo 1000:
  187.  
  188.  
  189. mov al,62
  190.  
  191. mov dx,1000
  192.  
  193. out dx,al
  194.  
  195.  
  196. L’altra peculiarità del registro DX è relativa alle divisioni e alle moltiplicazioni. Quando si divide un dividendo a 32 bit con un divisore a 16 bit, i 16 bit più alti del dividendo devono essere memorizzati in DX; dopo l’esecuzione delle divisione, il resto della divisione viene memorizzato in DX. (I 16 bit più bassi del dividendo devono essere memorizzati in AX, e il quoziente viene restituito in AX. Analogamente, quando si moltiplicano fattori a 16 bit, i 16 bit più alti del prodotto sono memorizzati in DX (i 16 bit più bassi del prodotto vengono memorizzati in AX).
  197.  
  198. <!--[if !supportEmptyParas]--> <!--[endif]-->
  199.  
  200. Il registro SI
  201.  
  202. <!--[if !supportEmptyParas]--> <!--[endif]-->
  203.  
  204. Esattamente come il registro BX, il registro SI può essere utilizzato come puntatore alla memoria. Per esempio,
  205.  
  206.  
  207. mov ax,0
  208.  
  209. mov ds,ax
  210.  
  211. mov si,20
  212.  
  213. mov al,[si]
  214.  
  215.  
  216. carica in AL il valore a 8 bit memorizzato all’indirizzo 20. Il registro SI diventa un potente strumento per l’indirizzamento di locazioni di memoria utilizzate dall’8086 per le istruzioni di gestione di stringhe. Per esempio,
  217.  
  218.  
  219. cld
  220.  
  221. mov ax,0
  222.  
  223. mov ds,ax
  224.  
  225. mov si,20
  226.  
  227. lodsb
  228.  
  229.  
  230. non solo carica in AX il valore il valore all’indirizzo di memoria a cui punta SI, ma aggiunge anche 1 a SI.
  231.  
  232. Tale operazione risulta molto efficace quando è necessario accedere a locazioni successive di memoria, come una stringa di testo. Ancora meglio, le istruzioni su stringhe possono essere eseguite automaticamente un certo numero di volte; in tal modo è possibile eseguire con una sola istruzione centinaia o migliaia di operazioni.
  233.  
  234. <!--[if !supportEmptyParas]--> <!--[endif]-->
  235.  
  236. Il registro DI
  237.  
  238. <!--[if !supportEmptyParas]--> <!--[endif]-->
  239.  
  240. Il registro DI è molto simile al registro SI infatti può essere utilizzato come puntatore alla memoria e possiede caratteristiche particolari se utilizzato con istruzioni su stringhe. Per esempio,
  241.  
  242.  
  243. mov ax,0
  244.  
  245. mov ds,ax
  246.  
  247. mov di,1024
  248.  
  249. add bl,[di]
  250.  
  251.  
  252. somma a BL il valore a 8 bit memorizzato all’indirizzo 1024. il registro DI è leggermente differente da SI quando viene utilizzato in istruzioni su stringhe; se SI ha la funzione di puntatore alla memoria origine per le istruzioni di gestione delle stringhe, DI ha sempre la funzione di puntatore alla destinazione. Inoltre, con le istruzioni su stringhe, SI, di solito, punta alla memoria relativa al registro DS, mentre DI punta sempre alla memoria relativa al registro ES. (Quando SI e DI vengono utilizzati come puntatori di memoria in istruzioni che non coinvolgono stringhe, puntano sempre alla memoria relativa a DS). Per esempio,
  253.  
  254.  
  255. cld
  256.  
  257. mov dx,0
  258.  
  259. mov es,dx
  260.  
  261. mov di,2048
  262.  
  263. stosb
  264.  
  265.  
  266. utilizza la funzione STOBS per memorizzare il valore di AL nell’indirizzo di memoria a cui punta DI e contemporaneamente per aggiungere 1 a DI. È necessario, tuttavia, esaminare in primo luogo i segmenti e i relativi registri, prima di illustrare le caratteristiche delle istruzioni su stringhe.
  267.  
  268. <!--[if !supportEmptyParas]--> <!--[endif]-->
  269.  
  270. Il registro BP
  271.  
  272. <!--[if !supportEmptyParas]--> <!--[endif]-->
  273.  
  274. Come BX, SI e DI il registro BP può essere utilizzato come puntatore alla memoria, ma con una differenza. Mentre i registri BX, SI e DI agiscono normalmente come puntatori alla memoria relativamente al registro DS (o, nel caso di DI utilizzato in istruzioni su stringhe, relativamente a ES), BP punta relativamente a SS, il registro di segmento STACK.
  275.  
  276. <!--[if !supportEmptyParas]--> <!--[endif]-->
  277.  
  278. Non sono ancora stati esaminati i segmenti, ma il concetto fondamentale è il seguente: un modo utile per passare i parametri a subroutine è quello di memorizzarli nello stack. Il C e il Pascal adottano tale tecnica.
  279.  
  280. <!--[if !supportEmptyParas]--> <!--[endif]-->
  281.  
  282. Lo stack risiede nel segmento a cui punta SS, o segmento STACK. I dati, d’altra parte, risiedono generalmente nel segmento a cui punta DS, o segmento dei dati. Poiché normalmente BX, SI e DI puntano al segmento dei dati, non è efficace utilizzare BX, SI o DI per puntare ai parametri passati nello stack poiché lo stack normalmente si trova in un segmento diverso.
  283.  
  284. <!--[if !supportEmptyParas]--> <!--[endif]-->
  285.  
  286. Il registro BP risolve tale problema indirizzando direttamente il segmento STACK. Per esempio,
  287.  
  288.  
  289. push bp
  290.  
  291. mov bp,sp
  292.  
  293. mov ax,[bp+4]
  294.  
  295.  
  296. accede al segmento STACK per caricare in AX il primo parametro passato da una chiamata in Turbo C ad una routine assembly.
  297.  
  298. <!--[if !supportEmptyParas]--> <!--[endif]-->
  299.  
  300. In breve, BP è progettato appositamente per gestire i parametri, le variabili locali ed altre necessità di indirizzamento della memoria nello stack.
  301.  
  302. <!--[if !supportEmptyParas]--> <!--[endif]-->
  303.  
  304. Il registro SP
  305.  
  306. <!--[if !supportEmptyParas]--> <!--[endif]-->
  307.  
  308. Il registro SP, altrimenti chiamato puntatore allo stack, è il meno generale dei registri di utilizzo generale, poiché è quasi completamente dedicato a uno scopo preciso: gestire lo stack. Lo stack è un’area di memoria in cui è possibile memorizzare e leggere valori in modalità last-in, first-out (l’ultimo che è entrato è il primo ad uscire). La classica analogia con lo stack è una pila di piatti. Poiché è possibile aggiungere piatti solo in cima alla pila e rimuoverli da essa, ciò rende evidente il motivo per cui il primo piatto che è stato messo è anche l’ultimo che viene rimosso.
  309.  
  310. <!--[if !supportEmptyParas]--> <!--[endif]-->
  311.  
  312. Il registro SP punta in ogni momento alla cima dello stack; come una pila di piatti, la cima dello stack è la locazione in cui il valore successivo da memorizzare verrà inserito. L’azione che consiste nell’inserire un valore nello stack viene chiamata pushing, e, infatti viene utilizzata un’istruzione PUSH per memorizzare valori nello stack. In maniera analoga l’azione che consente di recuperare valori nello stack viene chiamata popping e viene utilizzata l’istruzione POP.
  313.  
  314. <!--[if !supportEmptyParas]--> <!--[endif]-->
  315.  
  316. Anche se l’8086 permette di memorizzare valori in SP, aggiungere o sottrarre valori memorizzati in SP, esattamente come per tutti gli altri registri di utilizzo generale, quest’ultima è un’operazione da evitare, a meno di non sapere esattamente ciò che si sta facendo. Se si modifica il registro SP, varia la locazione della cima dello stack, e ciò può provocare gravi malfunzionamenti.
  317.  
  318. <!--[if !supportEmptyParas]--> <!--[endif]-->
  319.  
  320. Il motivo è semplice: le istruzioni di push e pop sono l’unico modo per utilizzare lo stack. Tutte le volte che si attiva o si termina l’esecuzione di una routine (una procedura, o una funzione), viene utilizzato lo stack. Inoltre, alcune risorse di sistema, come la tastiera e il clock di sistema, utilizzano lo stack per interrompere l’8086 per poter eseguire le proprie funzioni. Ciò significa che lo stack viene utilizzato sempre. Se il valore di SP viene modificato, anche per poche istruzioni, può capitare che lo stack non possa essere disponibile quando una risorsa di sistema intende utilizzarlo.
  321.  
  322. <!--[if !supportEmptyParas]--> <!--[endif]-->
  323.  
  324. In definitiva non si deve modificare il registro SP a meno che non sia indispensabile. È possibile eseguire le istruzioni di push, di pop, di routine, ma non si deve modificare direttamente il valore di SP, al contrario di tutti gli altri registri di utilizzo generale.
  325.  
  326. <!--[if !supportEmptyParas]--> <!--[endif]-->
  327.  
  328. Il puntatore alle istruzioni
  329.  
  330. <!--[if !supportEmptyParas]--> <!--[endif]-->
  331.  
  332. Il puntatore alle istruzioni (IP) contiene sempre l’offset (scostamento) della memoria in cui è memorizzata la successiva istruzione da eseguire. Non appena viene eseguita un’istruzione il puntatore alle istruzioni viene incrementato, in modo da puntare all’indirizzo di memoria successivo. Generalmente, l’istruzione nell’indirizzo successivo di memoria è l’istruzione da eseguire successivamente, ma alcune istruzioni, come le chiamate e i salti, possono fare in modo che venga caricato un valore diverso, per attivare un’istruzione diversa.
  333.  
  334. <!--[if !supportEmptyParas]--> <!--[endif]-->
  335.  
  336. Il puntatore alle istruzioni non può essere letto o modificato direttamente; solo le istruzioni di salto come quelle descritte possono modificare il valore del puntatore alle istruzioni.
  337.  
  338. <!--[if !supportEmptyParas]--> <!--[endif]-->
  339.  
  340. Il puntatore alle istruzioni non è sufficiente per specificare l’indirizzo in cui è memorizzata l’istruzione da eseguire successivamente. Ancora una volta la natura segmentata dell’indirizzamento della memoria dell’8086 complica il quadro. Per il fetch (prelievo) delle istruzioni, il registro CS contiene un indirizzo base e il puntatore alle istruzioni, quindi, contiene un offset rispetto a quell’indirizzo base.
  341.  
  342. <!--[if !supportEmptyParas]--> <!--[endif]-->
  343.  
  344. Tutte le volte che si è citato l’indirizzamento di memoria si è parlato di segmenti e ogni volta è stata rimandata la spiegazione completa. È giunto il momento di analizzare i segmenti di memoria.
  345.  
  346. <!--[if !supportEmptyParas]--> <!--[endif]-->
  347.  
  348. <!--[if !supportEmptyParas]--> <!--[endif]-->
  349.  
  350. <!--[if !supportEmptyParas]--> <!--[endif]-->
  351.  
  352. <!--[if !supportEmptyParas]--> <!--[endif]-->
  353.  
  354. <!--[if !supportEmptyParas]--> <!--[endif]-->
  355.  
  356. I registri di segmento
  357.  
  358. <!--[if !supportEmptyParas]--> <!--[endif]-->
  359.  
  360. Verrà qui analizzata una caratteristica abbastanza insolita dell’8086: la segmentazione della memoria. L’8086 è in grado di indirizzare 1 Mbyte di memoria. Sono necessari 20 bit per indirizzare tutte le locazioni di memoria in un Mbyte. Tuttavia, l’8086 utilizza puntatori a 16 bit, come, per esempio, il registro BX. Come può l’8086 utilizzare tutta la memoria con registri a 16 bit, mentre ne servirebbero a 20 bit?
  361.  
  362. <!--[if !supportEmptyParas]--> <!--[endif]-->
  363.  
  364. La risposta è che l’8086 utilizza uno schema di indirizzamento in due parti. È vero che vengono utilizzati puntatori a 16 bit, ma essi costituiscono solo una parte dell’indirizzamento completo. Ciascuno dei puntatori a 16 bit, o offset, viene combinato con il contenuto di un registro a 16 bit per formare un indirizzo di memoria a 20 bit.
  365.  
  366. <!--[if !supportEmptyParas]--> <!--[endif]-->
  367.  
  368. I segmenti e gli offset vengono combinati nel seguente modo: il valore del segmento viene spostato a sinistra di 4 bit (moltiplicato per 16) e quindi addizionato all’offset.
  369.  
  370. <!--[if !supportEmptyParas]--> <!--[endif]-->
  371.  
  372. Si considerino, per esempio le seguenti istruzioni:
  373.  
  374.  
  375. mov ax,1000h
  376.  
  377. mov ds,ax
  378.  
  379. mov si,201h
  380.  
  381. mov dl,[si]
  382.  
  383.  
  384. Il registro di segmento DS assume il valore 1000h, e SI vale 201h, che possono essere rappresentati come segmento:offset,cioè 1000:201. (i calcoli sui segmenti e gli offset vengono generalmente eseguiti in base 16, un’altra buona ragione per familiarizzarsi con la notazione esadecimali). In DL viene caricato il contenuto della memoria all’indirizzo ((DS*16) + SI), o ((1000h*16) + 201h):
  385.  
  386. <!--[if !supportEmptyParas]--> <!--[endif]-->
  387.  
  388. 1000h
  389.  
  390. * 16
  391.  
  392. _______
  393.  
  394. 10000h
  395.  
  396. + 201h
  397.  
  398. _______
  399.  
  400. 10201h
  401.  
  402. <!--[if !supportEmptyParas]--> <!--[endif]-->
  403.  
  404. Un’altro modo per ottenere il medesimo risultato è quello di spostare il valore segmento a sinistra di 4 bit, o una cifra esadecimali, che equivale a moltiplicare per 16:
  405.  
  406. <!--[if !supportEmptyParas]--> <!--[endif]-->
  407.  
  408. <!--[if !supportEmptyParas]--> <!--[endif]-->
  409.  
  410. <!--[if !supportEmptyParas]--> <!--[endif]-->
  411.  
  412. 10000
  413.  
  414. + 201
  415.  
  416. _____
  417.  
  418. 10201
  419.  
  420. <!--[if !supportEmptyParas]--> <!--[endif]-->
  421.  
  422. È facile capire ora che i programmi possono accedere esclusivamente alla memoria si 1 Mbyte dell’8086 utilizzando la coppia di valori segmento:offset. In effetti, è sempre necessario utilizzare la coppia segmento:offset per indirizzare la memoria; tutte le istruzioni e i modi di indirizzamento dell’8086 fanno riferimento a uno dei registri di segmento, anche se per alcune istruzioni è possibile forzare l’utilizzo di un altro registro di segmento, se necessario.
  423.  
  424. <!--[if !supportEmptyParas]--> <!--[endif]-->
  425.  
  426. Raramente verrà caricato un numero in un registro di segmento. Al contrario, verranno caricati i registri con i nomi dei segmenti, che verranno tradotti in numeri durante il processo di compilazione, linking ed esecuzione di un programma. Tale operazione è necessaria, in quanto non è possibile stabilire a priori dove verrà posizionato in memoria un determinato segmento; infatti, ciò dipende dalla versione del DOS, dal numero e dall’occupazione di eventuali programmi residenti e dalle necessità di memoria della parte restante del programma. Utilizzando i nomi dei segmenti tali definizioni vengono domandate al DOS e a Turbo Assembler.
  427.  
  428. <!--[if !supportEmptyParas]--> <!--[endif]-->
  429.  
  430. Il nome di segmento più comune è @data, che fa riferimento al segmento dei dati predefinito, quando vengono utilizzate direttive semplificate. Per esempio,
  431.  
  432. <!--[if !supportEmptyParas]--> <!--[endif]-->
  433.  
  434. .MODEL small
  435.  
  436. .DATA
  437.  
  438. Var1 DW 0
  439.  
  440. .CODE
  441.  
  442. mov ax,@data
  443.  
  444. mov ds,ax
  445.  
  446.  
  447. END
  448.  
  449. <!--[if !supportEmptyParas]--> <!--[endif]-->
  450.  
  451. fa in modo che DS punti al segmento dei dati, in cui è memorizzata Var1.
  452.  
  453. <!--[if !supportEmptyParas]--> <!--[endif]-->
  454.  
  455. L’utilizzo dei segmenti nell’8086 ha interessanti implicazioni. Da un lato, soltanto 64K di memoria possono essere indirizzati da un registro di segmento poiché 64K è la massima quantità di memoria che può essere indirizzata utilizzando un offset di 16 bit. Ciò significa che non è molto semplice l’indirizzamento di grandi blocchi di dati (superiori a 64K), poiché sia il registro di segmento che l’offset devono essere modificati frequentemente.
  456.  
  457. <!--[if !supportEmptyParas]--> <!--[endif]-->
  458.  
  459. <!--[if !supportEmptyParas]--> <!--[endif]-->
  460.  
  461. <!--[if !supportEmptyParas]--> <!--[endif]-->
  462.  
  463. L’indirizzamento di grandi blocchi di memoria nell’8086 è ancora più difficile, in quanto, a differenza degli altri registri di utilizzo generale, i registri di segmento non possono essere usati come sorgente e destinazione per operazioni aritmetiche e logiche. In effetti, l’unica operazione che può essere eseguita sui registri di segmento riguarda la copia di valori fra i registri di segmento e i registri di utilizzo generale o la memoria. Per esempio, addizionare 100 al registro ES richiede le seguenti istruzioni:
  464.  
  465.  
  466. mov ax,es
  467.  
  468. add ax,100
  469.  
  470. mov es,ax
  471.  
  472.  
  473. Ne deriva quindi, che l’8086 è progettato per gestire blocchi di memoria non superiori a 64K.
  474.  
  475. <!--[if !supportEmptyParas]--> <!--[endif]-->
  476.  
  477. Una seconda conseguenza dell’utilizzo dei segmenti è che ogni locazione di memoria può essere indirizzata con molte coppie possibili segmento:offset. Per esempio, l’indirizzo di memoria 100h è indirizzabile da valori segmento:offset di 0:100h, 1:F0h, 2:E0h e così via.
  478.  
  479. <!--[if !supportEmptyParas]--> <!--[endif]-->
  480.  
  481. Come i registri di utilizzo generale, ciascun registro di segmento ha una funzione ben specifica. Il registro CS punta alle istruzioni del programma (Codice), il registro DS punta ai Dati, il registro SS punta allo Stack e il registro ES è un jolly (“Extra”), e può puntare dove è necessario. Quanto segue è una descrizione più approfondita sui registri di segmento.
  482.  
  483. <!--[if !supportEmptyParas]--> <!--[endif]-->
  484.  
  485. Il registro CS
  486.  
  487. <!--[if !supportEmptyParas]--> <!--[endif]-->
  488.  
  489. Il registro CS punta all’inizio del blocco di 64K di memoria o segmento CODE, in cui è memorizzata la successiva istruzione da eseguire. La successiva istruzione da eseguire risiede a un offset specificato da IP nel segmento CODE; cioè all’indirizzo segmento:offset CS:IP. L’8086 non è in grado di eseguire un fetch a un’istruzione memorizzata in un segmento diverso da CS.
  490.  
  491. <!--[if !supportEmptyParas]--> <!--[endif]-->
  492.  
  493. Il registro CS può essere modificato da alcune istruzioni, compresi alcuni jump, call e return, e non può essere caricato direttamente in alcun modo.
  494.  
  495. <!--[if !supportEmptyParas]--> <!--[endif]-->
  496.  
  497. Nessuna modalità di indirizzamento o puntatori alla memoria diversi da IP vengono utilizzati con il registro CS.
  498.  
  499. <!--[if !supportEmptyParas]--> <!--[endif]-->
  500.  
  501. <!--[if !supportEmptyParas]--> <!--[endif]-->
  502.  
  503. <!--[if !supportEmptyParas]--> <!--[endif]-->
  504.  
  505. <!--[if !supportEmptyParas]--> <!--[endif]-->
  506.  
  507. <!--[if !supportEmptyParas]--> <!--[endif]-->
  508.  
  509. <!--[if !supportEmptyParas]--> <!--[endif]-->
  510.  
  511. Il registro DS
  512.  
  513. <!--[if !supportEmptyParas]--> <!--[endif]-->
  514.  
  515. Il registro DS punta all’inizio del segmento dei dati, che è il blocco di 64K in cui è memorizzata la maggior parte degli operandi. Generalmente, gli offset che coinvolgono i registri BX, SI o DI sono relativi a DS, poiché eseguono indirizzamento diretti alla memoria. Il segmento dei dati, come è implicito nel suo nome, è il segmento in cui risiedono i dati.
  516.  
  517. <!--[if !supportEmptyParas]--> <!--[endif]-->
  518.  
  519. Il registro ES
  520.  
  521. <!--[if !supportEmptyParas]--> <!--[endif]-->
  522.  
  523. Il registro ES punta all’inizio del blocco di memoria di 64K chiamato segmento EXTRA. Come indica il nome, il segmento EXTRA non ha una funzione precisa, ma è disponibile per qualunque necessità. Talvolta, il segmento EXTRA viene utilizzato come un blocco di 64K addizionali di memoria per i dati, ma l’accesso è di solito meno efficiente rispetto al segmento dati.
  524.  
  525. <!--[if !supportEmptyParas]--> <!--[endif]-->
  526.  
  527. L’utilizzo principale del segmento EXTRA è nella gestione delle stringhe. Tutte le istruzioni su stringhe che scrivono in memoria utilizzano ES:DI come indirizzo della memoria nella quale scrivere. Ciò significa che ES è molto utile come segmento di destinazione per la copia di blocchi, confronti fra stringhe, analisi della memoria e azzeramento di blocchi di memoria.
  528.  
  529. <!--[if !supportEmptyParas]--> <!--[endif]-->
  530.  
  531. Il registro SS
  532.  
  533. <!--[if !supportEmptyParas]--> <!--[endif]-->
  534.  
  535. Il registro SS punta all’inizio del segmento STACK, che è un blocco di memoria di 64K che contiene lo stack. Tutte le istruzioni che utilizzano lo stack, come le istruzioni di push, pop, call e return, utilizzano il segmento STACK poiché SP è l’unico registro in grado di indirizzare la memoria nel segmento STACK.
  536.  
  537. <!--[if !supportEmptyParas]--> <!--[endif]-->
  538.  
  539. Come illustrato precedentemente il registro, anche il registro BP lavora relativamente al segmento STACK. Ciò permette di utilizzare BP per indirizzare parametri e variabili che sono memorizzate nello stack.
  540.  
  541. Condividi:    Non ci sono commenti
  542. Non ci sono commenti per questo articolo
  543.  
  544. Lascia un commento
  545. Registrati a Mondo Informatico lasciare commenti, ascrivere articoli e guadagnare da subito con il paid to write con un unico nickname e avatar. Inoltre potrai segnalare notizie, scrivere articoli e mantenere lo storico nella tua pagina personale.
  546.  
  547. Se sei già registrato effettua il Login
  548.  
  549.  
  550.  
  551. Nome:  Email:  Url:  Messaggio:   Ricorda i miei dati per la prossima volta
  552. Inviami una e-mail quando ci sono altri commenti        
  553. Guadagna scrivendo!Mondo Informatico è parte di Mondo Revenue Share.
  554. In questo sito puoi iscriverti e proporre i tuoi articoli alla nostra redazione che li valutera' e li pubblichera'.
  555. Ogni tuo articolo conterra' della pubblicita' che ti permettera' di guadagnare.
  556. Per saperne di piu' consulta le nostre FAQ
  557.  
  558. FAQ
  559. Registrati
  560. MRS Network  
  561. Recensioni dello staffWode Modifica Wii
  562. Oggi, tra le recensioni dello staff, vogliamo presentarvi Wode Jukebox, una particolare modifica per la Nintendo Wii che non necessita di alcuna saldatura o conoscenza tecnica per poter essere utilizzata. Wode è un rivoluzionario modchipemulatore del lettore WII compatibile con qualsiasi console! Ti permetterà di espandere le funzionalità della tua WII grazie al suo semplice funzionamento [...]Cellulare CECT GT500 – Recensione dello staff4Geek Funny lettore mp3, radio fm, video – Recensione dello STAFF4Geek Aladin caricatore 20 in 1 – Recensione dello STAFF4Geek Playo multimedia player – Recensione dello STAFF4Geek Medley 3 MKV DMPR-850N – Recensione dello staff NetworkMondosport
  563. Mondotivu
  564. Mondonba
  565. Mondoinformatico
  566. CategorieAttualità (3092)
  567. Cellulari (1381)
  568. Computer Music (246)
  569. Console (759)
  570. Fisco Leggi Web (91)
  571. Hardware (1460)
  572. Imaging (1307)
  573. Internet (5200)
  574. Mondo Informatico (45)
  575. Open Source (802)
  576. Programmazione (684)
  577. Software (4324)
  578. Staff (15)
  579. Streaming (409)
  580. Web Marketing (464)
  581. Ultime dal BlogTuonorosso è diventato Papà! Auguri da tutti noi
  582. Utenti e publisher di mondoinformatico un lieto evento ci accumuna un pò tutti nel fare gli auguri al nostro amministratore , che ieri 16 novembre è diventato papà! Il nostro amato Tuonorosso, ha avuto una bambina di nome Camilla, e merita da parte di tutti noi un caloroso abbraccio per il lieto evento. Massimo Fanti quindi, dopo [...]
  583. 5 CommentiLeggi l'articolo >Tutte le recensioni
  584. Più lettiPiù commentati34582
  585. CLICKGiochi gratis, ecco una lista dei siti più conosciuti ed apprezzati
  586. Giochi gratis: la categoria dei giochi gratis fa parte sin ...
  587. 3899
  588. CLICKMediaraptor: software per scaricare musica e convertirla
  589. Trovare video e musica su Internet usando criteri, come autore, ...
  590. 3389
  591. CLICKCall of Duty: Black Ops - Password per minigiochi e i primi glitch online
  592. Call of Duty Black Ops è uscito ufficialmente da un giorno ...
  593. 1754
  594. CLICKTrucchi FIFA 11 Ultimate team
  595. Ci tengo a precisare che non ci sono veri è propri ...
  596. 16COMMLogo Google palline colorate: ma cosa è?Oggi Google forse vuole burlarsi dei suoi utenti… Il Logo ...
  597. 12COMMScrivi e vinci una fantastica Sony PSPPIU’ SCRIVI E PIU’ VINCI con Mondoinformatico & Youbuy C’è ...
  598. 9COMMGuadagnare con Internet tramite BlogSe avete intenzione di cominciare a guadagnare con Internet, ma ...
  599. 7COMMGoogle instant: ricerche e visualizzazioni istantaneeÈ una bella e comoda novità: Google Instant, un nuovo modo ...
  600.  
  601. Mondo Informatico on Facebookcopyright © 2010 Webefore snc cf/p.iva 03166260137Home Come Guadagnare FAQ Privacy Disclaimer
  602.  
  603.  
  604. Mondo Revenue Share Network
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement