logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Assembler - wyjaśnienie kodu

smagciu 01 Gru 2007 17:45 4417 5
REKLAMA
  • #1 4540751
    smagciu
    Poziom 12  
    Posty: 79
    Pomógł: 2
    Ocena: 2
    Witam. Mam tu fragment pewnego programu.

    .386p
    
    
    			stack	segment	stack use16
    					dd	100 dup(0)
    			stack	ends
    
    			data segment use16
    
    			gdt		dd	0
    					dd	0
    			code_desc	dd	0000ffffh
    					dd	00cf9a00h
    			data_desc	dd	0000ffffh
    					dd	00cf9200h
    			ret_desc	dd	0000ffffh
    					dd	00cf9a00h
    
    			gdt_label	label	fword
    			gdt_limit	dw	4*8-1
    			gdt_base	dd	?
    
    			protected_code_address	dd	0
    						dw	08h
    			data ends
    
    
    			code segment para public use16 'code'
    			assume cs:code,ds:data,ss:stack
    
    	start:
    			mov	ax,data
    			mov	ds,ax
    
    					; setup gdt
    			mov	eax,0


    i mam problem co bo nie wiem o co chodzi w tym

    stack	segment	stack use16
    					dd	100 dup(0)
    			stack	ends


    i w tym

    code segment para public use16 'code'


    Prosze o POMOC.
    Temat poprawiłem. Kod proszę umieszczać w znacznikach code - krzychoocpp
  • REKLAMA
  • #2 4541108
    Seba85
    Poziom 17  
    Posty: 110
    Pomógł: 24
    Pierwszy fragment deklaruje segment stosu o nazwie stack, use16 określa rozmiar stosu, dd 100 dup(0) rezerwuje 100 elementów typu dd o wartości 0

    Drugi fragment deklaruje segment o nazwie code, para oznacza, że segment rozpocznie się od adresu podzielnego przez 16, public oznacza, że wszystkie segmenty o tej nazwie utworzą jeden segment, a 'code' określa nazwę klasy dla segmentu
  • REKLAMA
  • #3 4541275
    smagciu
    Poziom 12  
    Posty: 79
    Pomógł: 2
    Ocena: 2
    OK. Dzięki. Tylko jeszcze jedno. co to jest ta klasa segmentu ???
  • REKLAMA
  • #4 4542593
    Seba85
    Poziom 17  
    Posty: 110
    Pomógł: 24
    W sumie to nigdy klas segmentu nie stosowałem, ale z tego co pamiętam jest to informacja dla linkera. Linker grupuje wszystkie segmenty należące do tej samej klasy, tak że nie są one porozwalane po całej pamięci, tylko są w jednym miejscu.

    Jeszcze co do use16, pisałem że określa rozmiar stosu, a chodziło mi o to, że określa rozmiar segmentu stosu, dokładnie chodzi o adresowanie 16-bitowe w obrębie segmentu.
  • REKLAMA
  • #5 4543038
    smagciu
    Poziom 12  
    Posty: 79
    Pomógł: 2
    Ocena: 2
    Jeszcze żebym dobrze zrozumiał. Czym sie różni kod 16 od 32 bitowego. Chodzi o dostęp do pamięci tak? 16 bitowy to pobierane są 2 bity naraz, a 32 to 4 naraz? Dobrze rozumiem?
  • #6 4543415
    Seba85
    Poziom 17  
    Posty: 110
    Pomógł: 24
    Adres efektywny jest wyliczany z adresu segmentu i offsetu. adres segmentu określa położenie segmentu w pamięci, a offset jest to przesunięcie względem początku segmentu. W przypadku adresowania rzeczywistego, adresy segmentów są przechowywane w rejestrach segmentowych (CS, DS, itd.), a offsety w pozostałych segmentach (CX, DX, ...).

    W trybie adresowania rzeczywistego, adres bazowy jest 20 bitowy, ale żeby zmieścił się w 16-bitowych rejestrach segmentowych przyjmuje się, że najmłodsze 4 bity to zera, dlatego adres bazowy powinien być podzielny przez 16. Stąd, adres efektywny = 16*adres_bazowy + offset.

    Rozmiar segmentu jest ograniczony do maksymalnej wartości jaką może osiągnąć offset, a ten z kolei jest ograniczony rozmiarem rejestru, w którym jest przechowywany. W trybie 16-bitowym segment może mieć maksymalny rozmiar 2^16 B, czyli 64kB. W trybie 32-bitowym segment może mieć rozmiar 2^32 B, co daje 4GB przestrzeń adresową.

    Ponieważ do adresowania 16-bitowego i 32-bitowego są wykorzystywane osobne instrukcje, trzeba zadeklarować w asemblerze chęć korzystania z 16-bitowego adresowania (use16), domyślnie jest używane 32-bitowe adresowanie (use32). W praktyce, jeżeli chcesz uruchamiać programy pod Windowsem, który czy chcesz czy nie korzysta z adresowania wirtualnego, nie ma znaczenia którego rodzaju adresowania użyjesz, ale pod czystym dosem 32-bitowe adresowanie raczej nie pójdzie.
REKLAMA