Флуд на КМ

Тема в разделе "Курилка, болталка", создана пользователем Wasabi, 25 июн 2014.

  1. Энки

    Энки Модератор Команда форума

    Сообщения:
    15.894
    Симпатии:
    15.563
    Адрес:
    Київ
    Контроллер. с ATmega168, по SPI, средствами библиотек, на nRF24L01+, приём тем же, и на ATmega328, и/или ATmega2560. Но то такое.
    Мне интересно, что делает компилятор, при объявлении массива, что ему можно давать в качестве элементов? И что прочитает компилятор, когда увидит ссылку на массив?
     
  2. Reno

    Reno Заслужений майстер

    Сообщения:
    9.441
    Симпатии:
    32.894
    Оттэта флуд зафлудили, евлампий коловрат... O=-
     
    kim chen loran и Sass нравится это.
  3. artembond

    artembond Заслужений майстер

    Сообщения:
    6.672
    Симпатии:
    4.963
    Адрес:
    Cygnus X-1
    Понятно. Что-то похожее делал когда-то. Но на AVR32
    Компилятор вообще весьма сложно работает. Если интересно чего он нагенерил, то это можно посмотрять (для GCC)
    1. Генерим объектный файл.
    gcc -g -c source.c
    Генерим ассемлер с си строками.
    objdump -d -S source.o > asm.txt
    Код:
    c.o:     file format elf64-x86-64
    
    
    Disassembly of section .text:
    
    0000000000000000 <send>:
    }board_t;
    
    board_t board;
    
    void send(board_t *b)
    {
       0:    55                       push   %rbp
       1:    48 89 e5                 mov    %rsp,%rbp
       4:    48 83 ec 10              sub    $0x10,%rsp
       8:    48 89 7d f8              mov    %rdi,-0x8(%rbp)
        if(b->msg1.msg_id == 0x01)
       c:    48 8b 45 f8              mov    -0x8(%rbp),%rax
      10:    0f b6 00                 movzbl (%rax),%eax
      13:    3c 01                    cmp    $0x1,%al
      15:    75 1c                    jne    33 <send+0x33>
        printf("boardcond=%02X\n",b->msg1.boardcond);  
      17:    48 8b 45 f8              mov    -0x8(%rbp),%rax
      1b:    0f b6 40 02              movzbl 0x2(%rax),%eax
      1f:    0f b6 c0                 movzbl %al,%eax
      22:    89 c6                    mov    %eax,%esi
      24:    bf 00 00 00 00           mov    $0x0,%edi
      29:    b8 00 00 00 00           mov    $0x0,%eax
      2e:    e8 00 00 00 00           callq  33 <send+0x33>
    }
      33:    90                       nop
      34:    c9                       leaveq
      35:    c3                       retq 
    
    0000000000000036 <main>:
    
    void main(void)
    {
      36:    55                       push   %rbp
      37:    48 89 e5                 mov    %rsp,%rbp
    
      board.msg1.msg_id = 0x01;
      3a:    c6 05 00 00 00 00 01     movb   $0x1,0x0(%rip)        # 41 <main+0xb>
      board.msg1.boardcond = 0x88;
      41:    c6 05 00 00 00 00 88     movb   $0x88,0x0(%rip)        # 48 <main+0x12>
      send(&board);
      48:    bf 00 00 00 00           mov    $0x0,%edi
      4d:    e8 00 00 00 00           callq  52 <main+0x1c>
    }
      52:    90                       nop
      53:    5d                       pop    %rbp
      54:    c3                       retq   
    Тоже самое с оптимизацией по скорости будет так выглядить.
    Код:
    c.o:     file format elf64-x86-64
    
    
    Disassembly of section .text:
    
    0000000000000000 <send>:
    
    board_t board;
    
    void send(board_t *b)
    {
        if(b->msg1.msg_id == 0x01)
       0:    80 3f 01                 cmpb   $0x1,(%rdi)
       3:    74 0b                    je     10 <send+0x10>
       5:    f3 c3                    repz retq
       7:    66 0f 1f 84 00 00 00     nopw   0x0(%rax,%rax,1)
       e:    00 00
        printf("boardcond=%02X\n",b->msg1.boardcond);  
      10:    0f b6 77 02              movzbl 0x2(%rdi),%esi
      14:    31 c0                    xor    %eax,%eax
      16:    bf 00 00 00 00           mov    $0x0,%edi
      1b:    e9 00 00 00 00           jmpq   20 <send+0x20>
    
    Disassembly of section .text.startup:
    
    0000000000000000 <main>:
    
    board_t board;
    
    void send(board_t *b)
    {
        if(b->msg1.msg_id == 0x01)
       0:    be 88 00 00 00           mov    $0x88,%esi
       5:    bf 00 00 00 00           mov    $0x0,%edi
       a:    31 c0                    xor    %eax,%eax
       c:    c6 05 00 00 00 00 01     movb   $0x1,0x0(%rip)        # 13 <main+0x13>
        printf("boardcond=%02X\n",b->msg1.boardcond);  
      13:    c6 05 00 00 00 00 88     movb   $0x88,0x0(%rip)        # 1a <main+0x1a>
      1a:    e9 00 00 00 00           jmpq   1f <main+0x1f>
    --- добавлено: 29 гру 2015 у 17:01 ---
    Если функцию send объявить static то еще короче получается.
    Код:
    typedef union
    {
        struct
        {
            unsigned char msg_id;
            unsigned char boardid;
            unsigned char boardcond;
        }msg1;
        struct
        {
            unsigned char msg_id;
            unsigned char boardidboardid1;
            unsigned char boardidboardid2;
            unsigned char blah_blah_blah;
        }msg2;
    }board_t;
    [CODE]
    c.o:     file format elf64-x86-64
    
    
    Disassembly of section .text.startup:
    
    0000000000000000 <main>:
    board_t board;
    
    static void send(board_t *b)
    {
        if(b->msg1.msg_id == 0x01)
        printf("boardcond=%02X\n",b->msg1.boardcond);  
       0:    be 88 00 00 00           mov    $0x88,%esi
       5:    bf 00 00 00 00           mov    $0x0,%edi
       a:    31 c0                    xor    %eax,%eax
       c:    c6 05 00 00 00 00 01     movb   $0x1,0x0(%rip)        # 13 <main+0x13>
      13:    c6 05 00 00 00 00 88     movb   $0x88,0x0(%rip)        # 1a <main+0x1a>
      1a:    e9 00 00 00 00           jmpq   1f <main+0x1f>
    board_t board;

    static void send(board_t *b)
    {
    if(b->msg1.msg_id == 0x01)
    printf("boardcond=%02X\n",b->msg1.boardcond);
    }

    void main(void)
    {

    board.msg1.msg_id = 0x01;
    board.msg1.boardcond = 0x88;
    send(&board);
    }

    [/CODE]
     
    Последнее редактирование модератором: 6 янв 2016
  4. Энки

    Энки Модератор Команда форума

    Сообщения:
    15.894
    Симпатии:
    15.563
    Адрес:
    Київ
    а что он нагенерит на єтом?
     
    Последнее редактирование модератором: 6 янв 2016
  5. artembond

    artembond Заслужений майстер

    Сообщения:
    6.672
    Симпатии:
    4.963
    Адрес:
    Cygnus X-1
    Ошибку разумеется.
     
  6. Энки

    Энки Модератор Команда форума

    Сообщения:
    15.894
    Симпатии:
    15.563
    Адрес:
    Київ
    Та да. Выдаёт.
    Буду перед сном тыком эти массивы колупать..
     
  7. artembond

    artembond Заслужений майстер

    Сообщения:
    6.672
    Симпатии:
    4.963
    Адрес:
    Cygnus X-1
    Блин, так у вас же ардуино!!! Это ДЕТСКАЯ ИГРУШКА. Это как лего. В теории можно построить настоящий дом, но исключительсно с игрушечными перекрытиями, игрушейной крышей, игрушечным водопроводом и игрушечными жителями.

    Хотите реально разобраться с Си, разбирайтесь с ним на x86, хотите что-то слклепать на мелкоконтроллерах, берите меклоконтроллер, и разбирайтесь.

    Если нужно что-то сделать, то если заказчик серьезный, то я могу сделать.
     
  8. Энки

    Энки Модератор Команда форума

    Сообщения:
    15.894
    Симпатии:
    15.563
    Адрес:
    Київ
    Победил dance
    Код:
    
    byte boardid = 255;
    byte boardcond = 0;
    word mesaga  ;
    void setup() {
      Serial.begin (9600);
    }
    void loop() {
    bitSet (boardcond,0);
    if (boardcond != 0)
    mesaga = word(boardid,boardcond);
    Serial.println (mesaga,BIN);
    delay (1000);
    }
    
    
     
  9. Reno

    Reno Заслужений майстер

    Сообщения:
    9.441
    Симпатии:
    32.894
    [​IMG]
     
    sanykrimea и Sass нравится это.
  10. Sass

    Sass Заслужений майстер

    Сообщения:
    4.084
    Симпатии:
    12.381
    На последних страницах я стал свидетелем самого увлекательного монолога в моей жизни.
     
    Reno нравится это.

Поделиться этой страницей