[Assembler] Bufor cykliczny w pamięci IRAM

0

Cześć,
dopiero zaczynam naukę assemblera na studiach. Na pierwszych zajęciach dostałem polecenie, aby napisać Generator liczb pseudolosowych w oparciu o Opóźniony ciąg Fibonacciego (generator LFG). Mój problem jest taki, że 10 liczb, na podstawie których będą wyłaniane liczby pseudolosowe, mają być umieszczone w pamięci IRAM, jako bufor cykliczny.
Umieszczam liczby w tejże pamięci korzystając z:

tab: db 4, 5, 3, 3, 3, 4, 6, 2, 6, 5

Następnie korzystam z tych danych w ten sposób, oczywiście wcześniej ustawiając akumulator na liczbę, którą chcę otrzymać:

MOV DPTR, #tab
MOVC A,@A+DPTR

I tutaj niestety nie mogę sobie poradzić. Otóż liczba pseudolosowa, którą otrzymuję ze wzoru, powinna zastąpić jedną z liczb w buforze, która zostałą wykorzystana do obliczenia jej, gdyż będzie wykorzystana w przyszłości do utworzenia kolejnej liczby.
Szukałem możliwości jak zastąpić liczbę z tab w pamięci IRAM, jakoś ją nadpisać, niestety po kilku godzinach prób rozwiązania nie znalazłem.
Bardzo proszę o pomoc w tej kwestii i z góry dziękuję.

0

Nie znam 8051 ale generalnie musisz pobrać adres komórki pamieci do której chcesz pisać (albo robić jakieś indexed addressing w stylu adres tab + rejestr z offsetem) i zrobić mov gdzie pierwszy operand (target) to będzie właśnie tenże adres, a drugim wartość którą chcesz wpisać

0

Dzięki za pomoc, jednak nadal z tym walczę. Z tego co wyczytałem w dokumentacji 8051, to

MOVX @DPTR, A

powinien rozwiązać mój problem, gdyż w DPTR mam adres, pod który chcę wpisać wartość. Niestety, korzystam z czegoś takiego:

    MOV A, #55h
	MOV DPTR, #tab
	MOVX @DPTR, A
	MOV A, #0h
	MOV DPTR, #tab
	MOVC A,@A+DPTR

Po tych operacjach, niestety, w Akumulatorze dostaję pierwotną wartość, a nie oczekiwaną, czyli 55h. Masz może jakiś pomysł, co robię źle?

0

Okej, śmieszna sprawa, ale gdy użyłem do odczytu danych z RAMu MOVC, o tak:

    MOV A, #0h
    MOV DPTR, #tab
    MOVC A,@A+DPTR

to na Akumulatorze pojawia się pierwotna liczba spod adresu DPTR. Gdy jednak użyłem tego:

    MOV A, #0h
    MOV DPTR, #tab
    MOVX A,@DPTR

w Akumulatorze pojawia się oczekiwane #55h. Według dokumentacji i różnych for/poradników 8051 MOVX i MOVC tak użyte powinny działać dosłownie tak samo, więc nie mam pojęcia, dlaczego działa tylko ta druga opcja.

Jeszcze raz dzięki za pomoc, jak będę miał z czymś jeszcze problem, to również poszukam pomocy na tym forum :)

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