mentos_007 pisze:Zrobiłam test tak że na górze zadeklarowałam sobie miejsca w pamięci na jakies tam moje zmienne (np cyfra1 equ 020h), niżej wrzuciłam wartości początkowe (zwykłym mov) a później jest LCALL procedura i ljmp $, a dopiero niżej procedura
Czasem lepiej załączyć kawałek listingu (w tagach CODE), opis słowno-muzyczny
można niekiedy źle zinterpretować...
Co do stosu - uważaj na jedną rzecz - aby w trakcie odkładania na stos
kolejnych adresów (rozkazy typu CALL) lub odkładania danych (rozkaz PUSH)
nie uległy uszkodzeniu (zamazaniu) zmienne programu, które zdefiniowałaś.
Stos w '51 ma to do siebie, że jego wierzchołek (aktualna wartość rej. SP) przesuwa
się w kierunku rosnących adresów, więc zmienne robocze i inne takie należy deklarować
__poniżej__ dna stosu czyli pierwszej wartości wpisanej do rej. SP (inicjacja stosu).
Poniżej masz przykład, jak bezsensownie umiejscowione zmienne (zmienna1...3)
zostaną zamazane przez pracujący podczas wywołania procedury any_proc stos.
Kod: Zaznacz cały
; STOS - demolka
;
zmienna1 equ 22h
zmienna2 equ 23h
zmienna3 equ 24h
;
; ustaw stos na 20h
mov SP, #20h
;
; zainicjuj jakies zmienne
mov zmienna1, #0aah
mov zmienna2, #55h
mov zmienna3, #99h
;
; wywolanie procedury
lcall any_proc
;
; martwa petla
ljmp $
;
any_proc:
push acc
mov DPTR, #1234h
movx A,@DPTR
pop acc
ret
;
end
Zmienne mają adresy 22h,23h,24h, dno stosu - 20h, po zakończeniu
procedury any_proc - jest "pozamiatane"

Najlepiej wrzuć sobie w/w programik do symulatora i oglądnij na pracy krokowej
(rozkaz po rozkazie) jak uszkadzają się kolejne wartości zmiennych...taki pokaz dobrze robi.
A pisze Ci to dlatego, że tego typu błędy jest bardzo ciężko wyłapać,
one nie zawsze wychodzą podczas symulacji...
Natasza
PS.
Po resecie wartość dna stosu w '51 to adres 07h - więc jeżeli korzystasz
z pamięci IDATA (internal RAM) w większej ilości - stos __trzeba świadomie zainicjować__
bezpieczną dla zgromadzonych tam danych wartością. Inaczej - kolorowe kredki.