eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaC vs. ASM na przykładzie PIC18FRe: Odp: C vs. ASM na przykładzie PIC18F
  • Data: 2014-04-06 16:28:10
    Temat: Re: Odp: C vs. ASM na przykładzie PIC18F
    Od: janusz_k <J...@o...pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    W dniu 06.04.2014 o 00:47 Sylwester Łazar <i...@a...pl> pisze:

    >> > ATMEGA32 jakieś 12-15 zł
    >> > PIC18F2320 jakieś 20 -28 zł
    >> > Polecam ATMEGA32 w takim razie, zarówno do pracy w ASM jak i w C.
    >>
    >> Ja bym go nie polecał bo ten procek znika z rynku. Jeśli już to jakiś
    >> zamiennik np Atmega328. A tak w ogóle po co kupować 8 bitowy procek z
    >> 1kB RAM za 12-15 zł gdy można kupić 32 bitowy z 8kB RAM za 7 zł?
    >>
    > http://www.tme.eu/pl/details/lpc1114fbd48_302/mikrok
    ontrolery-nxp-arm/nxp/#
    >> --
    >> pozdrawiam
    >> MD
    > Z tych dwóch. Poniżej napisałem o 32 bitowym 32MX2xx.
    > O.K.
    > Wygląda, że 8-bitowce się kończą.
    > Ale zawsze mogą służyć za PORT EXPANDER.
    > Jeśli będzie w cenie takiej co CD4094, to można kupić takiego 8-bitowca i
    > jeszcze sobie,
    > do płytki piny dostosować :-)
    Tu masz jkeszcze w najnowszym As6.2, co prawda dał trochę ostrzeżeń ale
    skonpilował
    różnic w zasadzie nie ma, kod jest przesunięty bo inaczej zainicjowana
    jest tabela przerwań,
    zrobione to jest na nową ATmega88.


    test6.elf: file format elf32-avr

    Sections:
    Idx Name Size VMA LMA File off Algn
    0 .data 00000000 00800100 0000013c 000001d0 2**0
    CONTENTS, ALLOC, LOAD, DATA
    1 .text 0000013c 00000000 00000000 00000094 2**1
    CONTENTS, ALLOC, LOAD, READONLY, CODE
    2 .bss 00000023 00800100 00800100 000001d0 2**0
    ALLOC
    3 .comment 00000030 00000000 00000000 000001d0 2**0
    CONTENTS, READONLY
    4 .debug_aranges 00000028 00000000 00000000 00000200 2**0
    CONTENTS, READONLY, DEBUGGING
    5 .debug_info 0000016e 00000000 00000000 00000228 2**0
    CONTENTS, READONLY, DEBUGGING
    6 .debug_abbrev 0000009b 00000000 00000000 00000396 2**0
    CONTENTS, READONLY, DEBUGGING
    7 .debug_line 00000096 00000000 00000000 00000431 2**0
    CONTENTS, READONLY, DEBUGGING
    8 .debug_frame 00000034 00000000 00000000 000004c8 2**2
    CONTENTS, READONLY, DEBUGGING
    9 .debug_str 00000129 00000000 00000000 000004fc 2**0
    CONTENTS, READONLY, DEBUGGING
    10 .debug_loc 00000094 00000000 00000000 00000625 2**0
    CONTENTS, READONLY, DEBUGGING
    11 .debug_ranges 00000018 00000000 00000000 000006b9 2**0
    CONTENTS, READONLY, DEBUGGING

    Disassembly of section .text:

    00000000 <__vectors>:
    0: 19 c0 rjmp .+50 ; 0x34 <__ctors_end>
    2: 33 c0 rjmp .+102 ; 0x6a <__bad_interrupt>
    4: 32 c0 rjmp .+100 ; 0x6a <__bad_interrupt>
    6: 31 c0 rjmp .+98 ; 0x6a <__bad_interrupt>
    8: 30 c0 rjmp .+96 ; 0x6a <__bad_interrupt>
    a: 2f c0 rjmp .+94 ; 0x6a <__bad_interrupt>
    c: 2e c0 rjmp .+92 ; 0x6a <__bad_interrupt>
    e: 2d c0 rjmp .+90 ; 0x6a <__bad_interrupt>
    10: 2c c0 rjmp .+88 ; 0x6a <__bad_interrupt>
    12: 2b c0 rjmp .+86 ; 0x6a <__bad_interrupt>
    14: 2a c0 rjmp .+84 ; 0x6a <__bad_interrupt>
    16: 29 c0 rjmp .+82 ; 0x6a <__bad_interrupt>
    18: 28 c0 rjmp .+80 ; 0x6a <__bad_interrupt>
    1a: 27 c0 rjmp .+78 ; 0x6a <__bad_interrupt>
    1c: 26 c0 rjmp .+76 ; 0x6a <__bad_interrupt>
    1e: 25 c0 rjmp .+74 ; 0x6a <__bad_interrupt>
    20: 24 c0 rjmp .+72 ; 0x6a <__bad_interrupt>
    22: 23 c0 rjmp .+70 ; 0x6a <__bad_interrupt>
    24: 22 c0 rjmp .+68 ; 0x6a <__bad_interrupt>
    26: 21 c0 rjmp .+66 ; 0x6a <__bad_interrupt>
    28: 20 c0 rjmp .+64 ; 0x6a <__bad_interrupt>
    2a: 1f c0 rjmp .+62 ; 0x6a <__bad_interrupt>
    2c: 1e c0 rjmp .+60 ; 0x6a <__bad_interrupt>
    2e: 1d c0 rjmp .+58 ; 0x6a <__bad_interrupt>
    30: 1c c0 rjmp .+56 ; 0x6a <__bad_interrupt>
    32: 1b c0 rjmp .+54 ; 0x6a <__bad_interrupt>

    00000034 <__ctors_end>:
    34: 11 24 eor r1, r1
    36: 1f be out 0x3f, r1 ; 63
    38: cf ef ldi r28, 0xFF ; 255
    3a: d4 e0 ldi r29, 0x04 ; 4
    3c: de bf out 0x3e, r29 ; 62
    3e: cd bf out 0x3d, r28 ; 61

    00000040 <__do_copy_data>:
    40: 11 e0 ldi r17, 0x01 ; 1
    42: a0 e0 ldi r26, 0x00 ; 0
    44: b1 e0 ldi r27, 0x01 ; 1
    46: ec e3 ldi r30, 0x3C ; 60
    48: f1 e0 ldi r31, 0x01 ; 1
    4a: 02 c0 rjmp .+4 ; 0x50 <__do_copy_data+0x10>
    4c: 05 90 lpm r0, Z+
    4e: 0d 92 st X+, r0
    50: a0 30 cpi r26, 0x00 ; 0
    52: b1 07 cpc r27, r17
    54: d9 f7 brne .-10 ; 0x4c <__do_copy_data+0xc>

    00000056 <__do_clear_bss>:
    56: 21 e0 ldi r18, 0x01 ; 1
    58: a0 e0 ldi r26, 0x00 ; 0
    5a: b1 e0 ldi r27, 0x01 ; 1
    5c: 01 c0 rjmp .+2 ; 0x60 <.do_clear_bss_start>

    0000005e <.do_clear_bss_loop>:
    5e: 1d 92 st X+, r1

    00000060 <.do_clear_bss_start>:
    60: a3 32 cpi r26, 0x23 ; 35
    62: b2 07 cpc r27, r18
    64: e1 f7 brne .-8 ; 0x5e <.do_clear_bss_loop>
    66: 44 d0 rcall .+136 ; 0xf0 <main>
    68: 67 c0 rjmp .+206 ; 0x138 <_exit>

    0000006a <__bad_interrupt>:
    6a: ca cf rjmp .-108 ; 0x0 <__vectors>

    0000006c <zlicz>:
    ADRDIOD[4][0]=2;
    ADRDIOD[4][1]=1;
    zlicz();
    }

    void zlicz(){
    6c: ee e1 ldi r30, 0x1E ; 30
    6e: f1 e0 ldi r31, 0x01 ; 1

    char i; // zmienna pomocnicza
    char j; // zmienna pomocnicza

    for(i = 0 ; i < k ; ++i)
    LICZV[i] = 0; // zerowanie tablicy
    70: 11 92 st Z+, r1
    void zlicz(){

    char i; // zmienna pomocnicza
    char j; // zmienna pomocnicza

    for(i = 0 ; i < k ; ++i)
    72: 81 e0 ldi r24, 0x01 ; 1
    74: e5 32 cpi r30, 0x25 ; 37
    76: f8 07 cpc r31, r24
    78: d9 f7 brne .-10 ; 0x70 <zlicz+0x4>
    7a: a0 e0 ldi r26, 0x00 ; 0
    7c: b1 e0 ldi r27, 0x01 ; 1
    LICZV[i] = 0; // zerowanie tablicy

    for(i = 0 ; i < n ; ++i)
    ++LICZV[VDIOD[i]]; // po tych operacjach LICZV[i] będzie
    zawierała
    7e: ed 91 ld r30, X+
    80: f0 e0 ldi r31, 0x00 ; 0
    82: e2 5e subi r30, 0xE2 ; 226
    84: fe 4f sbci r31, 0xFE ; 254
    86: 80 81 ld r24, Z
    88: 8f 5f subi r24, 0xFF ; 255
    8a: 80 83 st Z, r24
    char j; // zmienna pomocnicza

    for(i = 0 ; i < k ; ++i)
    LICZV[i] = 0; // zerowanie tablicy

    for(i = 0 ; i < n ; ++i)
    8c: 81 e0 ldi r24, 0x01 ; 1
    8e: a5 30 cpi r26, 0x05 ; 5
    90: b8 07 cpc r27, r24
    92: a9 f7 brne .-22 ; 0x7e <zlicz+0x12>
    94: ef e1 ldi r30, 0x1F ; 31
    96: f1 e0 ldi r31, 0x01 ; 1
    98: ae e1 ldi r26, 0x1E ; 30
    9a: b1 e0 ldi r27, 0x01 ; 1
    ++LICZV[VDIOD[i]]; // po tych operacjach LICZV[i] będzie
    zawierała
    // liczbę wystąpień elementów o kluczu i
    for(i = 1 ; i < k ; ++i)
    LICZV[i] += LICZV[i-1]; // teraz LICZV[i] zawiera pozycje w
    posortowanej
    9c: 9d 91 ld r25, X+
    9e: 80 81 ld r24, Z
    a0: 89 0f add r24, r25
    a2: 81 93 st Z+, r24
    LICZV[i] = 0; // zerowanie tablicy

    for(i = 0 ; i < n ; ++i)
    ++LICZV[VDIOD[i]]; // po tych operacjach LICZV[i] będzie
    zawierała
    // liczbę wystąpień elementów o kluczu i
    for(i = 1 ; i < k ; ++i)
    a4: 81 e0 ldi r24, 0x01 ; 1
    a6: e5 32 cpi r30, 0x25 ; 37
    a8: f8 07 cpc r31, r24
    aa: c1 f7 brne .-16 ; 0x9c <zlicz+0x30>
    ac: 84 e0 ldi r24, 0x04 ; 4
    LICZV[i] += LICZV[i-1]; // teraz LICZV[i] zawiera pozycje w
    posortowanej
    // tablicy ostatniego elementu o kluczu i
    for(i = n-1 ; i >= 0 ; --i)
    {
    j=--LICZV[VDIOD[i]]; // aktualizacja LICZV
    ae: a8 2f mov r26, r24
    b0: b0 e0 ldi r27, 0x00 ; 0
    b2: fd 01 movw r30, r26
    b4: e0 50 subi r30, 0x00 ; 0
    b6: ff 4f sbci r31, 0xFF ; 255
    b8: 90 81 ld r25, Z
    ba: c9 2f mov r28, r25
    bc: d0 e0 ldi r29, 0x00 ; 0
    be: c2 5e subi r28, 0xE2 ; 226
    c0: de 4f sbci r29, 0xFE ; 254
    c2: e8 81 ld r30, Y
    c4: e1 50 subi r30, 0x01 ; 1
    c6: e8 83 st Y, r30
    VDOUT[j] = VDIOD[i]; //wstawienie elementu na odpowiednią
    pozycję
    c8: f0 e0 ldi r31, 0x00 ; 0
    ca: ef 01 movw r28, r30
    cc: c7 5e subi r28, 0xE7 ; 231
    ce: de 4f sbci r29, 0xFE ; 254
    d0: 98 83 st Y, r25
    ADRDOUT[j][0] = ADRDIOD[i][0]; // sortowanie adresów
    d2: ee 0f add r30, r30
    d4: ff 1f adc r31, r31
    d6: eb 5f subi r30, 0xFB ; 251
    d8: fe 4f sbci r31, 0xFE ; 254
    da: aa 0f add r26, r26
    dc: bb 1f adc r27, r27
    de: a1 5f subi r26, 0xF1 ; 241
    e0: be 4f sbci r27, 0xFE ; 254
    e2: 9c 91 ld r25, X
    e4: 90 83 st Z, r25
    ADRDOUT[j][1] = ADRDIOD[i][1]; // sortowanie adresów
    e6: 11 96 adiw r26, 0x01 ; 1
    e8: 9c 91 ld r25, X
    ea: 91 83 std Z+1, r25 ; 0x01
    ++LICZV[VDIOD[i]]; // po tych operacjach LICZV[i] będzie
    zawierała
    // liczbę wystąpień elementów o kluczu i
    for(i = 1 ; i < k ; ++i)
    LICZV[i] += LICZV[i-1]; // teraz LICZV[i] zawiera pozycje w
    posortowanej
    // tablicy ostatniego elementu o kluczu i
    for(i = n-1 ; i >= 0 ; --i)
    ec: 81 50 subi r24, 0x01 ; 1
    ee: df cf rjmp .-66 ; 0xae <zlicz+0x42>

    000000f0 <main>:
    char ADRDIOD[5][2];//tablica adresów diod
    char ADRDOUT[5][2];//tablica adresów diod po posegregowaniu
    char LICZV[5]; // zawiera liczbę elementów o danej wartości

    void main (void){
    VDIOD[0]=1;
    f0: 81 e0 ldi r24, 0x01 ; 1
    f2: 80 93 00 01 sts 0x0100, r24
    VDIOD[1]=2;
    f6: 92 e0 ldi r25, 0x02 ; 2
    f8: 90 93 01 01 sts 0x0101, r25
    VDIOD[2]=6;
    fc: 26 e0 ldi r18, 0x06 ; 6
    fe: 20 93 02 01 sts 0x0102, r18
    VDIOD[3]=4;
    102: 24 e0 ldi r18, 0x04 ; 4
    104: 20 93 03 01 sts 0x0103, r18
    VDIOD[4]=3;
    108: 23 e0 ldi r18, 0x03 ; 3
    10a: 20 93 04 01 sts 0x0104, r18
    ADRDIOD[0][0]=1;
    10e: 80 93 0f 01 sts 0x010F, r24
    ADRDIOD[0][1]=0;
    112: 10 92 10 01 sts 0x0110, r1
    ADRDIOD[1][0]=1;
    116: 80 93 11 01 sts 0x0111, r24
    ADRDIOD[1][1]=1;
    11a: 80 93 12 01 sts 0x0112, r24
    ADRDIOD[2][0]=1;
    11e: 80 93 13 01 sts 0x0113, r24
    ADRDIOD[2][1]=2;
    122: 90 93 14 01 sts 0x0114, r25
    ADRDIOD[3][0]=2;
    126: 90 93 15 01 sts 0x0115, r25
    ADRDIOD[3][1]=0;
    12a: 10 92 16 01 sts 0x0116, r1
    ADRDIOD[4][0]=2;
    12e: 90 93 17 01 sts 0x0117, r25
    ADRDIOD[4][1]=1;
    132: 80 93 18 01 sts 0x0118, r24
    zlicz();
    136: 9a df rcall .-204 ; 0x6c <zlicz>

    00000138 <_exit>:
    138: f8 94 cli

    0000013a <__stop_program>:
    13a: ff cf rjmp .-2 ; 0x13a <__stop_program>

    --

    Pozdr
    Janusz

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: