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

Dziwne zachowanie .ORG w AVR Assembler na Atmega w Avr Studio

autoservice 05 Sie 2007 10:26 1488 6
REKLAMA
  • #1 4147379
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    Witam
    Procek Avr Atmega, kompilator Avr Studio, fragment kodu:
    sinus:
    .DB 0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae
    .DB 0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8
    .DB 0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5
    .DB 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff
    .DB 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7
    .DB 0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc
    .DB 0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3
    .DB 0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83
    .DB 0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51
    .DB 0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27
    .DB 0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a
    .DB 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00
    .DB 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08
    .DB 0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23
    .DB 0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c
    .DB 0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c

    Czyli zwykła tablica danych. Tylko dlaczego w pamięci programu zaczyna się ona od adresu 200 ???
    Pzdr.

    Dodano po 45 [sekundy]:

    ...zapomniałem dodać, przed kodem jest jeszcze .org 0x100
  • REKLAMA
  • #2 4147409
    lelekx
    Poziom 30  
    Posty: 1220
    Pomógł: 158
    Ocena: 90
    W AVR słowo maszynowe ma 16 bitów. Jest to najzupełniej normalne zachowanie.
  • REKLAMA
  • #3 4147419
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    ...do tej tablicy odwołuję się poprzez
    ldi r31,high(0x200)
    ldi r30,low(0x200)
    lpm
    wpisanie w nawiasach sinus nic nie daje, wpisanie 0x100 także nic. Ldi wtedy nie bierze elementów tablicy. Dziwne...
    Pzdr.
  • REKLAMA
  • REKLAMA
  • #6 4147448
    lelekx
    Poziom 30  
    Posty: 1220
    Pomógł: 158
    Ocena: 90
    Najlepiej sobie zdefiniować makra, ułatwiające tego typu manewry, np:
    
    .MACRO ldz
    ldi r31, high (@1 * 2)
    ldi r30, low (@1 * 2)
    .ENDMACRO
    

    i używać w kodzie
    
    ldz sinus
    lpm
    


    Dodano po 50 [sekundy]:

    Cytat:

    ldi ZH, HIGH(2*sinus)
    ldi ZL, LOW(2*sinus)
    lpm

    Pod warunkiem, że kolega ma zdefiniowane, co to jest ZH i ZL
  • #7 4147618
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    OK, dzięki wszystkim, już doczytałem w dokumentacji sposób adresowania za pomocą rejestru Z ;) Temat zamykam.
    Pzdr.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z adresowaniem tablicy danych w asemblerze AVR dla mikrokontrolera Atmega w środowisku AVR Studio. Autor używa dyrektywy .DB do zdefiniowania tablicy bajtów (sinus), jednak napotyka trudności z poprawnym odczytem danych za pomocą instrukcji ldi i lpm. Wskazano, że w AVR słowo maszynowe ma 16 bitów, co wpływa na adresowanie. Rozwiązaniem jest użycie rejestru Z (r31:r30) do wskazania adresu tablicy, przy czym adres musi być podwójnie przeskalowany (mnożony przez 2), ponieważ pamięć programu jest adresowana słowami, a nie bajtami. Zaproponowano definicję makra ułatwiającego ładowanie adresu do rejestru Z z automatycznym mnożeniem przez 2. Po wyjaśnieniu sposobu adresowania za pomocą rejestru Z problem został rozwiązany.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA