Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .MODEL SMALL, C
- ;Istnieją dwie możliwości, by to
- ;zagwarantować. W pierwszej nadanie nazwy zawierającej podkreślenie należy zapewnić
- ;samodzielnie. W drugiej natomiast nazwa procedury wpisywana jest tak samo jak w
- ;kodzie źródłowym w języku C, zaś uzupełniona zostaje o ów _char podkreślenia
- ;automatycznie dopiero podczas asemblacji. Aby jednak do tego doszło, asembler musi
- ;wiedzieć o konieczności przeprowadzenia takiej modyfikacji. Informowany jest o tym
- ;poprzez wyspecyfikowanie dodatkowego argumentu w dyrektywie .MODEL, określającego
- ;język wysokiego poziomu, z jakim należy zachować zgodność.
- .CODE
- PUBLIC SREDNIA, ZNAKI
- ;te dane oraz te procedury, które mają być
- ;dostępne także z innych modułów, muszą zostać zadeklarowane w module asemblerowym
- ;jako publiczne za pomocą dyrektywy PUBLIC.
- ;W zależności od użytego modelu pamięci
- SREDNIA PROC NEAR
- push bp ;zachowujemy pierwotną wartość bp
- mov bp, sp ;ustawienie rejestru bp, ustawienie wierzcholka stosu
- sub sp, 2 ;zarezerwowanie miejsca dla zmiennej lokalnej
- push cx ;zachowujemy warośći cx
- push si ;-||-
- push ds
- push ss
- push sp
- xor ax, ax
- mov [bp-2], ax ;zerowanie zmiennej lokalnej
- mov si, [bp+4] ;pobranie pierwszego parametru (adres tablicy) do rejestru si, przeskakujemy o stara wartość bp i adres powrnotny.
- mov cx, [bp+6] ;pobranie drugiego parametru (rozmiar tablicy) do rejestru cx
- mov [bp-2], cx ;wrzucamy do zmiennej lokalnej na stosie rozmiar tablicy
- dec cx ;bo petla ma sie wykonac tylko n-1 razy, gdzie n to liczba elementow tablicy
- finit ;inicjalizujemy koprocesor
- fild WORD PTR[bp-2] ;przepisuje na poczatek ilosc elementow aby moc wykonac dzielenie
- fld DWORD PTR [si] ;pobieram pierwszy element z tablicy typu float
- Petla: cmp cx, 00h ;sprawdzamy warunek czy to koniec tablicy
- jz Dzielenie ;jezeli tak to skaczemy do dzielenia
- dec cx ;jezeli nie to dekrementujemy cx
- add si, 04h ;przesuwam wskaznik na kolejne 4 bajty zawierajace kolejna liczbe typu float
- fld DWORD PTR [si] ;pobieram koljena liczbe z tablicy typu float
- fadd ;sumuje obie liczby i odkladam je na szczycie stosu koprocesora
- jmp Petla ;skok do Petla aby ponownie kontynuowac sumowanie
- Dzielenie: fdivr ;dzielenie odwrotne, tak bym uzyskal average
- pop sp ;aby moc ja zwrocic do glownego programu
- pop ss ;zdejmujemy ze stosu odpowiendie rejestry
- pop ds
- pop si
- pop cx
- mov sp, bp ;usuwamy zmienne lokalne
- pop bp
- ret ;konczymy procedure
- ENDP
- ZNAKI PROC NEAR
- push bp ;zachowujemy pierwotną wartość bp
- mov bp, sp ;ustawienie rejestru bp, ustawienie wierzcholka stosu
- sub sp, 2 ;zarezerwowanie miejsca dla zmiennej lokalnej
- push cx ;zachowujemy warośći cx
- push si ;-||-
- push ds
- push ss
- push sp
- xor ax, ax
- mov [bp-2], ax ;zerowanie zmiennej lokalnej
- mov si, [bp+4] ;pobranie drugiego parametru (adres tablicy) do rejestru si
- mov cl, [bp+6] ;pobranie pierwszego parametru (_char ASCII) do rejestru cl
- Petla2: cmp BYTE PTR [si], 00h ;sprawdzenie czy to koniec tablicy (_char zero)
- jz Koniec ;Jezeli tak to konczymy
- cmp cl, BYTE PTR [si] ;sprawdzenie czy to szukany _char
- jz Inkr ;jezeli tak skaczemy do Inkrementuj
- inc si ;jezeli nie bierzemy kolejny _char w tablicy
- jmp Petla2 ;i skaczemy na poczatek petli
- Inkr: inc WORD PTR [bp-2] ;jezeli _char wystapil inkremetujemy zmienna lokalna
- inc si ;i biezemy nastepny _char
- jmp Petla2 ;skaczemy na poczatek
- Koniec: mov ax, [bp-2] ;jezeli array sie skonczyla to umieszczemay wartosc zmiennej lokalnej w rejestrze ax
- pop sp ;aby moc ja zwrocic do glownego programu
- pop ss
- pop ds
- pop si
- pop cx
- mov sp, bp ;usuwamy zmienne lokalne
- pop bp
- ret
- ENDP
- .STACK
- DB 100h DUP (?)
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement