Jak działa podana instrukcja ?

0

Witajcie! :)
potrzebuję zrozumieć tylko jedną drobnostkę w tym o to króciutkim kodzie. Jest to makro czyszczące ekran, a dokładnie wypełniające ekran spacjami czyli pustymi znakami.

Clear MACRO VidAddress, ClearAtom, BufLength	
		LES DI,DWORD PTR VidAddress 	
		MOV AX,ClearAtom 			
		MOV CX,BufLength		
		SHR CX,1			
		REP STOSW		
ENDM 

no i najważniejsze, o co chodzi z tym kawałekiem kodu:
LES DI,DWORD PTR VidAddress

Wiem że ogólnie chodzi w tym o to że, wpisuje adres ekranu konsoli do ES:DI
Ale dlaczego jest DWORD PTR i dlaczego ta wartość wynosi 32 bity?
Mam nadzieję że idę dobrym tropem
Dziękuję za pomoc każdemu! :)

1

Bardzo proste: http://4programmers.net/Assembler/Instrukcje_procesor%C3%B3w_rodziny_80x86_%28L%29

W skrócie:

Ładuje 32-bitowy wskaźnik z pamięci do określonego rejestru ogólnego np. DI oraz rejestru segmentowego ES. Przesunięcie umieszczane jest w DI, a segment w ES. Aby używać tej instrukcji słowo pod mniej znaczącym adresem w pamięci musi zawierać przesunięcie, a pod bardziej znaczącym adresem segment. To ułatwia ładowanie wskaźników typu far ze stosu i tablicy przerwań.

; kawałek pamięci np. pod adresem 0x0000:0x7E00:
0x00007E00:   0x00 0x00 0x00 0xB8
;             ---------
;                 ^ mniej znaczący adres

Zatem:

LES DI, DWORD PTR 0x0000:0x7E00     ; lub etykieta VidAddress

; w rejestrze segmentowym ES znajdzie się 0xB800
; w rejestrze DI będzie 0x0000 

Przykład 0x00:

; zachowaj oryginalne rejestry
PUSH BP
MOV BP, SP

; załaduj dane pod adres etykiety VidAddress
MOV SP, VidAddress
PUSH 0xB800
PUSH 0x0000

; pobierz dane z adresu etykiety do odpowiednich rejestrów/rejestrów segmentowych
LES DI, DWORD PTR VidAddress

; przywróć oryginalne rejestry
MOV SP, BP
POP BP

Przykład 0x01:

; ustaw wskaźnik do etykiety DI
MOV DI, VidAdress

; załaduj dane do pamięci pod adresem w rejestrze DI
MOV WORD [DI], 0x0000
MOV WORD [DI + 0x02], 0xB800

; i teraz linijka z przykładu
LES DI, DWORD PTR VidAddress

UWAGA: Kompilator Nasm nie przyjmie "DWORD PTR VidAddress", zamiast tego użyj "[VidAddress]"

1 użytkowników online, w tym zalogowanych: 0, gości: 1