abc Asembler - elektronski priručnik
V dio Registri

Segmentni registri

Segmentni registri

Segmenti su specifične oblasti definisane u programu koje sadrže podatke, kod i stek.
Postoje 3 glavna segmenta:

  • Code Segment: On sadrži sve instrukcije koje treba da se izvrše. 16-bitni Code Segment registar ili CS registar sprema početnu adresu code segmenta.
  • Data Segment: On sadrži podatke, konstante i radne oblasti. 16-bitni Data Segment registar ili DS registar sprema početnu adresu data segmenta.
  • Stack Segment: On sadrži podatke i vraća adrese procedura ili potprograma. On je implementiran kao 'stek' struktura podataka. Stack Segment registar ili SS registar sprema početnu adresu steka.

 

Osim DS, CS i SS registara, postoje i drugi, tzv. extra segmentni registri – ES (extra segment), FS i GS, koji obezbjeđuju dodatne segmente za spremanje podataka.
U asemblerskom programiranju, program mora da pristupa memorijskim lokacijama. Sve memorijske lokacije unutar segmenta su relativne u odnosu na početnu adresu segmenta. Segment počinje na adresi ravnomjerno djeljivoj sa 16 ili heksadecimalnim 10. Dakle, krajnja desna hex cifra na svim takvim memorijskim adresama je 0, koja generalno nije spremljena u segmentnim registrima.
Segmentni registri spremaju početne adrese segmenta. Da bi se dobila tačna lokacija podatka ili instrukcije unutar segmenta, potrebna je offset vrijednost (ili tzv. displacement). Da bi referencirao bilo koju memorijsku lokaciju u segmentu, procesor kombinuje adresu segmenta u segmentnom registru sa offset vrijednošću lokacije.

Primjer:
Pogledajmo sljedeći jednostavni program da bismo razumjeli upotrebu registara u asemblerskom programiranju. Ovaj program prikazuje 9 zvjezdica na ekranu zajedno sa jedostavnom porukom:

section 	      .text
      global _start      ;must be declared for linker (gcc)
_start: 			     ;tell linker entry point
       mov edx,len       ;message length
       mov ecx,msg       ;message to write
       mov ebx,1         ;file descriptor (stdout)
       mov eax,4    	 ;system call number (sys_write)
       int 0x80 	     ;call kernel

       mov edx,9 		 ;message length
       mov ecx,s2 	     ;message to write
       mov ebx,1 		 ;file descriptor (stdout)
       mov eax,4 		 ;system call number (sys_write)
       int 0x80 		 ;call kernel
       mov eax,1 		 ;system call number (sys_exit)
       int 0x80 		 ;call kernel

section        .data
msg db  'Prikazuje 9 zvjezdica',0xa 	;a message
len equ $ - msg 			        	;length of message
s2 times 9 db  '*'

Kada se gore navedeni kod kompajlira i izvrši, on će proizvesti sljedeći rezultat:

Prikazuje 9 zvjezdica

*********

Kontrolni registri    <    Index    >    Sistemski pozivi