Pytanie:
Dlaczego ten kod nie został napisany w dużo prostszy sposób?
İlker Demirel
2017-09-02 00:14:58 UTC
view on stackexchange narkive permalink

Podczas pracy nad językiem asemblera natknąłem się na pytanie.Oto pytanie:

Załóżmy, że bit P2.2 jest używany do sterowania oświetleniem zewnętrznym, a bit P2.5 - światłem wewnątrz budynku.Pokaż, jak włączyć zewnętrzne światło i wyłączyć wewnętrzne.

Podane rozwiązanie:

  SETB C;CY = 1
ORL C, P2.2;CY = P2.2 ORed w / CY
MOV P2.2, C;włącz go, jeśli nie
CLR C;CY = 0
ANL C, P2,5;CY = P2,5 ANDed w / P2,5
MOV P2.5, C;wyłącz, jeśli nie
 

Po prostu czułem, że kodowanie będzie takie samo:

  SETB P2.2
CLR P2.5
 

Co w tym złego?

Może tylko dydaktyka - pokazująca, jak używać wędzidła jako akumulatora.W tym konkretnym przypadku nie widzę żadnej korzyści.To wygląda jak kod asemblera 8051.
@SpehroPefhany Ale o ile wiem, rejestr Acc jest używany w niektórych przypadkach, ponieważ jest to jedyny rejestr, który obsługuje niektóre instrukcje, takie jak DA, RR, RL itp. Nie sądzę, aby tak było w tym przypadku.Czy się mylę?
Noszenie jest nieco szerokie.Możesz chcieć użyć go jako akumulatora w niektórych przypadkach, takich jak ocena logiki drabinkowej.
Pięć odpowiedzi:
Olin Lathrop
2017-09-02 00:56:08 UTC
view on stackexchange narkive permalink

Masz rację, wygląda na to, że kod, który pokazujesz, jest głupi.Być może na jakiejkolwiek maszynie, na której to działa, nie można wykonać natychmiastowych operacji ustawiania bitów na portach I / O i dlatego coś takiego jak SETB P2.2 nie jest możliwe.

Nadal ustawiając bit CY na 1, a następnie ORingowanie czegokolwiek do tego jest po prostu głupie.To samo dotyczy ustawiania bitu CY na 0, a następnie wstawiania do niego AND.Oczywiście bit CY można bezpośrednio skopiować do bitu pinu I / O, ponieważ robi to kod.Powinno to być najwyżej 4 instrukcje, z pewnością nie 6.

Mogę więc powiedzieć, że jeśli bit jest adresowalny bitowo, mogę używać instrukcji bitowych na jakimkolwiek bicie, prawda?
@ İlk: Niekoniecznie.Może istnieć ograniczenie, takie jak instrukcje bitowe działają tylko na niektórych rejestrach, pewnej „bliskiej” pamięci i tym podobnych.Nie znając procesora, nie możemy z całą pewnością stwierdzić, czy SETB P2.2 byłby możliwy.Jednak ustawienie SETB C, po którym następuje MOV P2.2, C, jest oczywiście możliwe.
@OlinLathrop: Procesor jest prawie na pewno wariantem 8051, a zestaw instrukcji dla nich pozwoliłby na użycie tych samych lokalizacji dla instrukcji „bit SETB” i „bit CLR”, jak dla „bitu MOV, C”.Ponadto, podczas używania instrukcji dyskretnych do odczytu portu we / wy, zaktualizowania wartości i zapisania jej z powrotem da się uzyskać inną semantykę od instrukcji odczytu-modyfikacji-zapisu, wszystkie instrukcje bitowe używają tej samej semantyki odczytu-modyfikacji-zapisu na I/ O porty.
supercat
2017-09-02 01:45:15 UTC
view on stackexchange narkive permalink

Kod prawie na pewno dotyczy procesora używającego zestawu instrukcji 8051.Na tym procesorze podana przez ciebie odmiana kodu miałaby taki sam efekt jak oryginał, z tą różnicą, że działałaby szybciej.Wykonanie „ORL C, P2.2”, gdy ustawiono przeniesienie, nie będzie miało żadnego zauważalnego efektu, z wyjątkiem zmarnowania pewnej liczby cykli (dwa cykle procesora w sumie 24 cykle zegara na 8051, jeśli dobrze pamiętam; prawdopodobnie inna liczba w niektórych innych wariantach).Podobnie jest z wykonywaniem „ANL C, P2.5”, gdy przeniesienie jest jasne.Chociaż mogą istnieć pewne rodzaje procesorów, w których żądanie odczytania niektórych lokalizacji we / wy miałoby jakiś obserwowalny efekt, nie sądzę, aby jakikolwiek procesor w stylu 8051 kiedykolwiek miał takie zachowanie dla jakichkolwiek adresowanych bitowo lokalizacji we / wy, dużomniej dla bitów P2.

Być może celem kodu było zademonstrowanie instrukcji ORL C, bit i ANL C, bit , ale wydaje się to dziwnym przykładem ich zademonstrowania.

D Krueger
2017-09-02 18:04:46 UTC
view on stackexchange narkive permalink

Podany kod asemblera jest prawdopodobnie wygenerowany przez kompilator.Jest to niezoptymalizowana wersja następujących instrukcji C, gdzie P2_2 i P2_5 to obiekty adresowalne bitowo:

  P2_2 | = 1;
P2_5 & = 0;
 

Może się to wydawać równoważne z P2_2 = 1; i P2_5 = 0; , ale tak nie jest, jeśli rejestry adresowalne bitowo są obiektami ulotnymi.Operacja odczytu, modyfikacji i zapisu na obiekcie ulotnym musi wykonać odczyt i zapis w tej kolejności.Gwarantuje to, że rzeczywiście wystąpią jakiekolwiek skutki uboczne odczytu lub zapisu rejestru.

Chociaż nie znam żadnego rejestru adresowalnego 8051 bitów ze skutkami ubocznymi, kompilator nie może założyć, że go nie ma lub nigdy nie będzie.

Dobra uwaga na temat możliwego generowania przez kompilator.Jednak następnie przesuwa pytanie, dlaczego ktoś napisałby P2_2 | = 1 zamiast po prostu P2_2 = 1.
Trevor_G
2017-09-02 01:34:45 UTC
view on stackexchange narkive permalink

Prawdziwa różnica między nimi może być niewielka.

W Twojej uproszczonej odpowiedzi logiką jest odczytanie portu, ustawienie lub wyczyszczenie wartości bitu, a następnie zapisanie go z powrotem do portu.Zauważ, że cały port można tutaj przepisać.

Z drugiej strony rozwiązanie wykorzystuje instrukcję bitową MOV, która może działać w nieco inny sposób.

Bez wchodzenia w szczegóły konkretnej użytej tutaj części trudno jest określić, czy istnieje różnica, czy też ma znaczenie.

Albo może to być po prostu instruktor, który postanowił zmusić Cię do myślenia… co jest w końcu… jego prawdziwą pracą.

Guill
2017-09-12 11:38:52 UTC
view on stackexchange narkive permalink

Jedyną odpowiedzią jest to, że procesor nie obsługuje bezpośrednio instrukcji 1-bitowych.Jednak gdy używany jest bit przenoszący, wie, że manipulowany jest tylko jeden bit.



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...