logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Assembler 51. Jaka jest różnica między rozkazem Mov A, a Mov Acc?

domex32 03 Gru 2006 14:31 2432 6
REKLAMA
  • #1 3289447
    domex32
    VIP Zasłużony dla elektroda
    Posty: 6714
    Pomógł: 585
    Ocena: 2451
    Witam. Czy mógł by mi ktos wyjasnic jaka jest różnica między rozkazem Mov A, a Mov Acc. Rozumiem ze w sposobie adresowania, ale chciałbym coś więcej prosic jesli mozna. Pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 3290192
    strdaniel
    Poziom 20  
    Posty: 357
    Pomógł: 29
    Ocena: 4
    witaj

    jak zapewne wiesz 51 w przestrzeni adresowej sfr ma akumulator czyli ACC czyli jest to komóreczka pamięci (rejestr ) o adresie hex E0, i jako taka komórka pamięci wewnętrzej czy raczej przestrzeni SFR może być adresowany poprzez własnie np. mov acc (tzw. adresowanie bezpośrednie)
    ale ponieważ jest to rejest bardzo ważny dla operacji arytmetycznych i nie tylko dostęp do niego mają zasoby(ALU) bezpośrenio czyli nie poprzez odczytywanie przez wewnętrzną magistrale adresu i danych

    np. inkremetacja inc a - 1 bajt a inc acc dwa bajty

    kródko mówiąc pierwsza operacja jak łatwo siędomyślić jest wykonana szybciej i zajmuje mniej miejsca
    powiem wiecej mozeby dodać do siebie akumulator poprzez add a,acc
    super nie

    ok to tyle mam nadzieje że wszystko jasne :D
  • REKLAMA
  • Pomocny post
    #3 3290486
    robson_s-ec
    Poziom 15  
    Posty: 98
    Pomógł: 7
    Ocena: 4
    To wszystko prawda, aczkolwiek wydaje mi się, że różnie to widzą różne kompilatory. Ofszem Acc jest nazwą rejestru SFR i można ją używać jak każdej innej zmiennej czyli w rozkazach z adresowaniem bezpośrednim (direct). Oczywiście jeśli to możliwe to lepiej jest korzystać z rozkazów wykonywanych na akumulatorze. Ale czy każdy kompilator zrozumie inc Acc jako inc 0E0h już nie da się zagwarantować (a powinien). Róznica jest w sposobie adresowania, a co za tym idzie w długości rozkazu np.:
    zmienna .eq 030h
    mov A, zmienna

    jest traktowane jako mov A, direct i zajmie nam 2 bajty i bedzie sie wykonywac przez 12 cykli zegarowych, podczas gdy to:
    zmienna .eq 030h
    mov Acc, zmienna

    jest traktowane jako mov direct, direct; zajmuje nam 3 bajty i będzie się wykonywać aż przez 24 cykle zegarowe.
  • REKLAMA
  • Pomocny post
    #4 3291385
    strdaniel
    Poziom 20  
    Posty: 357
    Pomógł: 29
    Ocena: 4
    robson_s-ec napisał:
    To wszystko prawda, aczkolwiek wydaje mi się, że różnie to widzą różne kompilatory. Ofszem Acc jest nazwą rejestru SFR i można ją używać jak każdej innej zmiennej czyli w rozkazach z adresowaniem bezpośrednim (direct). Oczywiście jeśli to możliwe to lepiej jest korzystać z rozkazów wykonywanych na akumulatorze. Ale czy każdy kompilator zrozumie inc Acc jako inc 0E0h już nie da się zagwarantować (a powinien). .


    no cóż tutaj to bym sobie popolemizował - jeżeli piszemy program w asemblerze to kompilator nie powinien zamieniać rozkazu inc acc, na rozkaz inc a - bo byłoby to niewskazane bo np. z pewnych powodów ja chcę właśnie ten dłuższy rozkaz wykorzystać a nie krótszy
    na poziomie c to rozumie że kompilator może sobie takie rozkazy optymalizować ale dla assemblera to raczej odpada,
  • REKLAMA
  • Pomocny post
    #5 3291755
    robson_s-ec
    Poziom 15  
    Posty: 98
    Pomógł: 7
    Ocena: 4
    strdaniel, masz pełną rację. Tylko ja już miałem róóóóżne przygody z "ciekawymi" kompilatorami. A z takim optymalizowaniem na siłę bez wiedzy użytkownika to jest jak z Windowsem. Robi wszystko za Ciebie no i wychodzi tak jak zwykle. :]
    Ostatecznie masz rację.
    Anyway zauważył ktoś, że to nie te forum? -> Mikrokontrolery
  • Pomocny post
    #6 3292348
    strdaniel
    Poziom 20  
    Posty: 357
    Pomógł: 29
    Ocena: 4
    według mnie tak na logike to kompilator asemblera ma tylko moje rozkazy napisane symbolicznie przekształcić na hexa z sumą kontroloną i w odpowiednim formacie , wiec nadal będę się upierał przy swoim
    chociaż przyznaje że nie znam wszystkich kompilatorów i może faktycznie robią jakieś optymalizacje, chociaz włąśnie po to piszemy w asemblerze bo sami chcemy sobie kod optymalizować

    pozdrawiam
  • #7 3292610
    domex32
    VIP Zasłużony dla elektroda
    Posty: 6714
    Pomógł: 585
    Ocena: 2451
    Oki dziękuje za wszystkie odpowiedzi i pozdrawiam ;]

Podsumowanie tematu

LABEL_AI_GENERATED
Różnica między rozkazami MOV A, a MOV ACC w asemblerze dla mikrokontrolera 8051 wynika z adresowania i długości rozkazu. ACC (akumulator) jest rejestrem specjalnym w przestrzeni SFR o adresie 0xE0, do którego dostęp jest szybszy i bardziej bezpośredni niż do ogólnej pamięci wewnętrznej. Rozkaz MOV ACC jest traktowany jako adresowanie bezpośrednie rejestru ACC, co może skutkować dłuższym i wolniejszym kodem (np. 3 bajty i 24 cykle zegarowe), podczas gdy MOV A jest krótszy i szybszy (2 bajty, 12 cykli zegarowych). W asemblerze rozkazy te nie powinny być automatycznie optymalizowane przez kompilator, ponieważ programista może świadomie wybierać dłuższe instrukcje. W praktyce jednak różne kompilatory mogą różnie interpretować te rozkazy, co wpływa na ich długość i czas wykonania. Podsumowując, MOV A to szybszy i krótszy rozkaz operujący na akumulatorze, natomiast MOV ACC to rozkaz z adresowaniem bezpośrednim rejestru ACC, potencjalnie dłuższy i wolniejszy.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA