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

Jak wykorzystać dyrektywa SET oraz .if .else .ENDIF - asm

klon111 05 Gru 2010 17:22 1492 6
REKLAMA
  • #1 8830085
    klon111
    Poziom 11  
    Witam
    Ostatnio natknąłem się na poniższy kod i mam pytanie
    jak wykorzystywać zmienne xxxx w asm
    -czy można ja zmieniać za pomocą rejestrów
    -czy if można zastosować z ino zmienną
    Próbowałem coś kombinować ale nie uzyskuje to co bym potrzebował zamiast "CPI"

    .SET xxxx = 0 ; definiujemy 0 lub 1
    .CSEG
    .IF xxxx == 1
    RJMP skocz
    .ELSE
    RJMP skocz1
    .ENDIF

    Proszę o podpowiedz
  • REKLAMA
  • #2 8831892
    kots
    Poziom 12  
    To są dyrektywy kompilacji/asemblacji ich wartość musi być znana w momencie kompilacji programu i służą do tworzenia programów różnych wersji skompilowango programu na podstawie tego samego źródła.
  • REKLAMA
  • #3 8831925
    klon111
    Poziom 11  
    dzięki za podpowiedz
    a to by się tak przydało w asm
  • REKLAMA
  • #4 8832135
    tmf
    VIP Zasłużony dla elektroda
    Przecież masz to w asm. Zmienne to nic innego jak etykiety. Tyle, że w przeciwieństwie do języków wyższego poziomu to ty decydujesz jak potraktować taką etykietę i jaki typ przechowuje. Oczywiście nie możesz zrobić if costam dla takiej zmiennej, ale możesz to samo osiągnąć instrukcjami CP, CPI. Jeśli ci brakuje tego if'a to sobie stwórz makro. Jak porządnie omakrujesz asembler to zacznie przypominać c. A wtedy tylko jeden mały kroczek cię dzieli do porzucenia asemblera na rzecz c.
  • REKLAMA
  • #5 8835144
    klon111
    Poziom 11  
    Dzięki za podpowiedzi .
    Rozumiem wiem jak działają makra
    lubię asm i poradzę sobie po prostu zaciekawiła mnie funkcja if i widzę ze coś z tymi zmiennymi można coś zrobić .
    Tylko nie widzę ich wartości i nie wiem gdzie są zapisane.

    Z tą funkcjo bawiłem się na AVRStudio-4 ale nie wgrywałem do ATmega8 ok 4godz i po zmianie wartości zmiennej nie jest utrzymana w dalszym programie można dane zmienić przed samo funkcjo i wtedy jest ok.
    Jest najgorzej iż podczas działania oprogramowania nie da się przepisać żadnej wartości

    pisze do ATmega8 Odbiornik na Rc5 w asm celem sterowania nim
  • #6 8835215
    tmf
    VIP Zasłużony dla elektroda
    .if to dyrektywa preprocesora, działa jak ci pisano, wyłącznie na etapie translacji mnemoników na opcody. W gotowym programie nie działa, bo jej tam już po prostu nie ma. Zwykle .if i pokrewne wykorzystuje się do zrealizowania kompilacji warunkowej. Np. w zależności od typu procesora masz np. 256 bajtów SRAM lub więcej, co za tym idzie adres jest 8 lub 16 bitowy. Na mniejszych procesorach możesz przyoszczędzić miejsca robiąc kompilację warunkową, która wyrzuca ci fragmenty odpowiedzialne za inkrementacje/dekrementacje starszych 8 bitów adresu. Z kolei etykiety to tylko adresy w pamięci, one nawet nie muszą wskazywać na zmienne. To ty musisz wiedzieć co się znajduje pod zawartym w etykiecie adresem. Np. jeśli to będzie:
    label1: MOV R1, R2
    to label1 wskazuje na adres komórki pamięci z instrukcją mov, jeśli z kolei napiszesz:
    label2: .DB 100
    i dodatkowo będzie to w segmencie pamięci SRAM, to label2 możesz wykorzystać jako adres 8-bitowej zmiennej.
  • #7 9310920
    klon111
    Poziom 11  
    Dzięki za podpowiedz.
REKLAMA