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

[AVR][Bascom] - High i Low w $Asm

mirekk36 09 Paź 2008 00:43 1472 2
  • #1 5613929
    mirekk36
    Poziom 42  
    Witam,

    I znowu nie wiem czy mi się coś nie pokiełbasiło ale.... chciałbym uzyskać coś takiego:

    Const _liczba = 38022


    a później dalej gdzieś w kodzie:

       $asm
          ldi   R16, High(_liczba)
          ldi   R17, Low(_liczba)
       $end asm


    ... no i oczywiście nie mogę tego zrobić bo Bascom krzyczy, że nie widzi Labela o nazwie _liczba

    jak więc mogę sobie w kodzie coś takiego we wstawce asemblerowej zrobić??? mówię tu o zwykłym programie a nie kodzie biblioteki

    Dodano po 1 [minuty]:

    dodam, że oczywiście próbowałem tak:

    .equ _liczba = 38022


    i tak:

    .equ _liczba1 = high(38022)
    .equ _liczba2 - low(38022)


    żeby później zrobić tylko

       ldi  R16, _liczba1
       ldi  R17, _liczba2


    zamiast const'a i też nic :(

    Poprawiłem tytuł - regulamin p.11.1
    [zumek]
  • Pomocny post
    #2 5616244
    ZbeeGin
    Poziom 39  
    Ponieważ asemblerowe operatory high() i low() są także jednymi z zatrzeżonych funkcji języka BASCOM Basic, i tak niestety są rozpoznawane, trzeba użyć innego "sposobu":
    $regfile = "m8def.dat"
    
    Const _liczba = &HAA55
    Const _liczba2 = _liczba / 256
    
    $asm
      ldi   R16, _liczba
      ldi   R17, _liczba2
    $end Asm

    Tym samym do R16 trafia &H55 a do R17 &HAA.

    Jeśli BASCOM traktowałby stałe tak samo jak etykiety - co w sumie powinno być tym samym, gdyż i tu, i tu jest przypisywana jakaś wartość - to format z operatorami high() i low() byłby poprawny.
    Niestety stałe w BASCOM są traktowane w nieco inny sposób. Np. podlegają jakby "kompresji" - dwie takie same stałe są zapisywane tylko raz w pamięci kompilatora.
REKLAMA