ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
30 июня
241367 Топик полностью
Bill (02.03.2011 18:22 - 18:40, просмотров: 285) ответил mazur на Спасибо всем!!! Что не сочли за труд, нашли время, ткнули носом, подсказали, дали идей. Я получил даже больше, чем просил.
Добавлю и я свою копеечку. В свое время, в порядке тренировки, я написал небольшую библиотечку функций для работы с множествами 256 бит. Исходный текст вспомогательной функции, вычисляющей адрес байта заданного элемента, сам байт и позицию бита в байте: ; ; 24-Dec-05 BK Initial edit ; 24-Dec-05 BK Last update ; $func.inc rseg CODE ; Code segment ENTRY$ setcalc$ ; ; ; ** setcalc$ -- функция вычисляет адрес элемента множества и позицию бита, ; ему соответствующего ; ; Аргументы ; R16:R17 - адрес множества; ; R18 - элемент множества. ; ; Returns: ; R31:R30 - адрес элемента; ; R16 - байт, содержащий данный элемент; ; R17 - позиция элемента в байте. ; ; movw r30, r16 ; Установить указатель mov r22, r18 ; Вычислить смещение байта относительно адреса множества lsr r22 ; lsr r22 ; lsr r22 ; clr r23 ; andi r18, 0x07 ; Вычислить позицию бита clr r19 ; movw r20, r30 ; Сохранить адрес множества ldi r30, LOW bitTbl ; Получить позицию бита ldi r31, HIGH bitTbl ; add r30, r18 ; adc r31, r19 ; lpm r17, Z ; в r17 movw r30, r20 ; Восстановить указатель add r30, r22 ; Выбрать байт из множества adc r31, r23 ; ld r16, z ; в r15 ret rseg NEAR_F bitTbl: db 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 ; bits 0...7 end Далее та же функция на Си. #define NMEMBERS 256 #define NBYTES NMEBERS/8 typedef struct { // Элемент множества char byte; // Байт множества с указанным элементом char bit_pos; // Позиция элемента в байте char *ptr; // Указатель на байт с элементом } Tmember; static __flash char bitTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; Tmember set_calc(char *set, char mb) { Tmember _memb; _memb.ptr = set + (mb >> 3); _memb.byte = *_memb.ptr; _memb.bit_pos = bitTbl[mb % 8]; return _memb; } и результат трансляции
      1          #define	NMEMBERS	256
      2          #define	NBYTES		NMEBERS/8
      3          
      4          typedef struct	{
      5          		char	byte;
      6          		char	bit_pos;
      7          		char	*ptr;
      8          		}
      9          Tmember;
     10          
     11          static __flash

   \                                 In  segment NEAR_F, align 1, keep-with-next
     12          char	bitTbl[] =	{0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
   \                     bitTbl:
   \   00000000   020108042010       DB 1, 2, 4, 8, 16, 32, 64, 128
   \              8040        
     13          	

   \                                 In  segment CODE, align 2, keep-with-next
     14          Tmember set_calc(char *set, char mb)
   \                     set_calc:
     15          	{
   \   00000000   01F8               MOVW    R31:R30, R17:R16
   \   00000002   2F42               MOV     R20, R18
     16          	Tmember	_memb;
     17          	_memb.ptr	= set + (mb >> 3);
   \   00000004   2F62               MOV     R22, R18
   \   00000006   9566               LSR     R22
   \   00000008   9566               LSR     R22
   \   0000000A   9566               LSR     R22
   \   0000000C   E070               LDI     R23, 0
   \   0000000E   0FE6               ADD     R30, R22
   \   00000010   1FF7               ADC     R31, R23
   \   00000012   019F               MOVW    R19:R18, R31:R30
     18          	_memb.byte	= *_memb.ptr;
   \   00000014   8100               LD      R16, Z
     19          	_memb.bit_pos	= bitTbl[mb % 8];
   \   00000016   7047               ANDI    R20, 0x07
   \   00000018   E0F0               LDI     R31, 0
   \   0000001A   2FE4               MOV     R30, R20
   \   0000001C   ....               SUBI    R30, LOW((-(bitTbl) & 0xFFFF))
   \   0000001E   ....               SBCI    R31, (-(bitTbl) & 0xFFFF) >> 8
   \   00000020   9114               LPM     R17, Z
     20          	return _memb;
   \   00000022   9508               RET
     21          	}

   Maximum stack usage in bytes:

     Function CSTACK RSTACK
     -------- ------ ------
     set_calc     0      2


   Segment part sizes:

     Function/Label Bytes
     -------------- -----
     bitTbl            8
     set_calc         36

 
 36 bytes in segment CODE
  8 bytes in segment NEAR_F
 
 44 bytes of CODE memory
Размер ассемблерного кода - 46 байт, Си кода - 44 байта. Как видно, разница невелика. Или нет?