vhdl / asembler sposoby...

0

Witam, nadszedl czas ze to ja zwracam sie z prosba do was o pomoc.
Chodzmi mi o różne sposoby przekazywania argumentow do procedury.
Jezyk programowania - vhdl / asembler

Pozdrawiam i z gory dzieki za jakis odzew lub wskazowki itd.
z.aciek

0

Wiec tak:

zalozmy, ze mamy

procedure foo(x, y: word);

stdcall/safecall: (najczesciej uzywane w windows) wrzucasz parametry na stos od prawej do lewej,
przykad:

push y
push x
call foo

funkcja odpowiedzialna jest za wyczyszczenie stosu

cdecl: (uzywana w C) to samo co stdcall, tyle, ze kod wywolujacy czysci stos
przyklad:

push y
push x
call foo
add sp, 8

register: (chyba delphi to uzywa) parametry ida do rejestrow (kolejno EAX, EDX, ECX - o ile sie zmieszcza), reszta na stos od lewej do prawej
przyklad:

mov ax, x
mov dx, y
call foo

funkcja odpowiedzialna jest za wyczyszczenie stosu

pascal: (a moze to delphi uzywa :)) cos jak stdcall, tylko od lewej do prawej

push x
push y
call foo

funkcja odpowiedzialna jest za wyczyszczenie stosu

mam nadzieje, ze nie przekrecilem niczego, w helpie od delphi jest fajna tabelka z tym, albo na google pod haslem calling conventions

0

jesli mamy takie polecenie
SCALL -> czyli wartosci sa wrzucane na stos,

ale w vhdl'u jest to rowniez wywolanie procedury

when 16#025# => Code := x"1C"; -- SCALL
when 16#026# => Code := x"19"; -- czyli skok szesnastokowo o 19 (gdzie zn. sie procedura

procedura:

   when 16#040# => Code := x"16"; -- MOV A, 0
   when 16#041# => Code := x"00";
   -----------------------------
   when 16#042# => Code := x"18"; -- MOV [F002], A
   when 16#043# => Code := x"02";
   when 16#044# => Code := x"F0";
   -----------------------------
   when 16#045# => Code := x"A0"; -- MOV A, [R1&R0] - cyfry
   -----------------------------
   when 16#046# => Code := x"18"; -- MOV [F003], A
   when 16#047# => Code := x"03";
   when 16#048# => Code := x"F0";
   -----------------------------
   when 16#049# => Code := x"84"; -- MOV A, R4 - kropka
   -----------------------------
   when 16#04A# => Code := x"18"; -- MOV [F004], A
   when 16#04B# => Code := x"04";
   when 16#04C# => Code := x"F0";
   -----------------------------
   when 16#04D# => Code := x"A2"; -- MOV A, [R3&R2] - anody
   -----------------------------
   when 16#04E# => Code := x"18"; -- MOV [F002], A
   when 16#04F# => Code := x"02";
   when 16#050# => Code := x"F0";
   -----------------------------
   when 16#051# => Code := x"1B"; -- RET

i teraz w jaki sposob tutaj sa przekazywane wartosci do procedury, bo te polecenie SCALL zarowno zapisuje na wierzcholku stosu jak i sluzy do wywolania procedury.
RET - pobiera wartosc z wierzcholka i ja zwraca.

0

a wlasciwie to caly kod asemblera jaki napisalem

mov a, 0f
mov r5, a
mov a [f000]
and a, r5
mov r0, a
mov a, 00
mov r2, a
scall
mov a, 0f
mov r5, a
mov a, [f000]
ror a
ror a
ror a
ror a
and a, r5
mov r0, a
mov a, 01
mov r2, a
scall
nop
sjmp

mov a, 02
mov r1, a
mov a, 03
mov r3, a
mov a, 01
mov r4, a
mov a,0
mov [f002], a
mov a, [r1&r0]
mov [f003], a
mov a, [r4]
mov [f004], a
mov a, [r3, r2]
mov [f002], a
ret

i teraz tak, jaki sa inne sposoby przekazania tych wartosci do procedury.

scall to Mem16(SP-1)<-PC, SP<-SP-2, PC<-PC+signext(ra8)

rejesrty: kazdy 8bitowy
r0-mlodsza cz. cyfry
r1-starsza cz. cyfry
r2-mlodsza cz, anod
r3-starsza cz. anod
r4-kropka - stale podawana 1
r5-rejestr pomocniczy

z pod adresu [f000] sa pobierane wartosci z przelacznikow
pod adresem [f002] znajudje sie tablica odpowiadajaca cyfrom 0-F
pod adresem [f003] znajudje sie tablica odpowiadajaca pozycji anod

aha,kod jest napisany na kontrolera 8 bitowego.
lista komend z jakich mozna korzystac:
http://pbulo.strony.wi.ps.pl/dyda/k8/k-8_lista.pdf

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