Ads_700x200

wtorek, 8 kwietnia 2014

Wstawki ASM w C - część 02

Tym razem bez zbędnych zapowiedzi, ----  no to lecimy dalej ;)




zapraszam tym razem na nieco dłuższą dawkę materiału .... aaa jakoś tak wyszło



;)

12 komentarzy:

  1. Rewelacja Panie Mirku. Kolejny super poradnik. Ja tylko czekam na kolejne bo po prostu się je chłonie Klikam wszystko co popadnie jeżeli chodzi o YT, i inne społeczności. Czy jest szansa na dołączenie kodu? Pozdrawiam serdecznie i dużo zdrowia życzę!!!

    OdpowiedzUsuń
    Odpowiedzi
    1. ale masz na myśli ten krótki kod który pisałem na żywo w poradniku ?

      Usuń
  2. To już wiem za co się wezmę jak nabiorę praktyki w C:)
    Obejrzałem tylko z ciekawości, bo jak na razie nie mam pojęcia o ASM...

    OdpowiedzUsuń
  3. Witam Panie Mirku i dziękuję za kolejną część.
    Spodziewałem się tego odcinka na weekend, a tu ciach,jest na początku tygodnia.
    Zaskoczenie podwójne,oczywiście w pozytywnym tego słowa znaczeniu.
    Kiedy moja ukochana żona zobaczyła radość na mojej twarzy,powiedziała:
    -Teraz już wiesz jak to jest, kiedy się czeka na kolejny odcinek serialu :-)
    Pozdrawiam no i łapki w górę oczywiście.

    OdpowiedzUsuń
    Odpowiedzi
    1. Dlatego proszę ode mnie przekazać serdecznie pozdrowienia dla małżonki ;)

      Usuń
  4. Witam,
    Powód dlaczego w czasie analizy programu zamiast lsl widzimy add ma proste, a wręcz banalne, wytłumaczenie. Cytując naszego klasyka "wystarczy zajrzeć do odpowiedniego pdf-a" ;)
    8 bitowe AVRy nie mają rozkazów LSL, ROL, CLR, TST, SBR, CBR i większości rozgałęzień (branchów) podawanych w dokumentacjach procesora. Tak na prawdę rozkaz asemblerowy "LSL Rd" jest bitowo dokładnie tym samym kodem (opcode) co rozkaz "ADD Rd, Rd".
    Dla "LSL Rd" opcode wygląda następująco:
    0000 11 d4 d4 d3 d2 d1 d0 d3 d2 d1 d0
    a dla "ADD Rd, Rr" mamy opcode:
    0000 11 r4 d4 d3 d2 d1 d0 r3 r2 r1 r0
    więc jak Rr będzie równe Rd, to opcode będą identyczne.
    Tak samo z rozkazami "ROL Rd" który jest zgodny z "ADC Rd, Rd" oraz innymi pozostałymi parami.
    AVRy to procesory RISC (Reduced Instruction Set Computers), więc z założenia mają mało instrukcji a dzięki sztuczce "marketingowej" użytkownik dostaje dodatkowe rozkazy w asemblerze (także dzięki temu nie musi się skupiać na podstawach matematyki i pamiętać że ADD Rd, Rr przy Rr = Rd to jest LSL Rd a może zająć się programowaniem).

    I dlatego deasemblerowany kod zawiera podstawowe znaczenie danego opcode (skąd deasembler ma widzieć jakiego mnemonika chciał autor użyć).

    Poniżej komplet "sztucznych" instrukcji:
    SBR Rd,K -> ORI Rd, K
    CBR Rd,($FF - K) -> ANDI Rd, K
    TST Rd -> AND Rd, Rd
    CLR Rd -> EOR Rd, Rd
    LSL Rd -> ADD Rd, Rd
    ROL Rd -> ADC Rd, Rd
    wszystkie instrukcje rozgałęzień (branch) -> BRBS, BRBC

    Wszystko to można znaleźć (sprawdzić) w Atmelowym pdfie http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf

    --
    Pozdrawiam,
    Robert

    OdpowiedzUsuń
    Odpowiedzi
    1. Panie Robert dziękuję za ŚLICZNE wyjaśnienie, sam lepiej bym tego nie zrobił a tu przyda się ono olbrzymiej ilości osób .... TO nazywa się dzielenie wiedzą, jeszcze raz dzięki i pozdrawiam ;)

      Usuń
  5. A ja ostatnio znalazłem coś takiego: http://thegaragelab.com/galleries/quickies/one_pin_serial.png
    Tutaj zaimplementowano UART na 1 pinie (half duplex) - ciekawe rozwiązanie - a piszę o tym tutaj bo to maleńka biblioteczka ASM (62b flash i nie zużywa ram) - może takie rozwiązanie też pokazać czytelnikom w którymś z odcinków? Może np zaprzęgając do pracy Attiny85? a może nawet Attiny 13? :) - fajna byłaby to opcja debugowania dla tych super małych AVRków. Kod w tym miejscu: https://github.com/thegaragelab/nightlight/blob/master/firmware/softuart.S

    OdpowiedzUsuń
    Odpowiedzi
    1. Bardzo fajny przykład i na pewno będę chciał kiedyś wspomnieć i o tego tupu wstawkach czyli pisaniu plików *.S ;)

      Usuń
    2. Byłoby super - mam nadzieję, że taki odcinek pojawi się niebawem (trzymam kciuki) jako kolejna część wstawek ASM :)

      Usuń
  6. Czy używanie tej opcji wyrzucania zbędnych funkcji z pamięci flash ,można użyć np. zamiast dyrektyw preprocesora ,co ma się nam kompilować ,a co nie. Taka opcja dla "leniwych" ,bo powiedzmy mam dużą bibliotekę bez tych dyrektyw co kompilować a co nie. I wiele funkcji nie używanych w main mi się nie potrzebnie kompiluje.

    Mogę to traktować jako "złoty środek" w każdej okoliczności? ,pozdrawiam.

    OdpowiedzUsuń
    Odpowiedzi
    1. Zobacz sobie na programik: ECLIPSE GADGET

      http://atnel.pl/eclipse-gadget.html

      i jego opcję o nazwie BOOST, którą można włączyć ;) ona właśnie to robi i można to zrobić dla każdego projektu

      Usuń