Ну, прямо уж в кучу. Так, небольшая кучка. Макро с адресами оказываются несколько медленнее, чем с данными, но могут применяться слева от знака присваивания.
#define LSB(x) (((uint8_t *)&(x))[0])
#define MSB(x) (((uint8_t *)&(x))[1])
inline uint8_t hi( uint16_t x ) { return x >> 8; }
inline uint8_t lo( uint16_t x ) { return x; }
uint8_t a, b;
void foo( uint16_t x )
{
a = LSB(x);
b = MSB(x);
}
void foo1( uint16_t x )
{
a = lo(x);
b = hi(x);
}
uint16_t bar( uint8_t hi, uint8_t lo )
{
uint16_t r;
MSB(r) = hi;
LSB(r) = lo;
return r;
}
uint16_t bar1( uint8_t hi, uint8_t lo )
{
return hi << 8 | lo;
}
/////////////////////////////////////////////////////////////////////////////////
\ In section .text, align 2, keep-with-next
28 void foo( uint16_t x )
29 {
\ foo: (+1)
\ 0x0 0xB401 PUSH {R0}
30 a = LSB(x);
\ 0x2 0x.... LDR.N R0,??DataTable3
\ 0x4 0xF89D 0x1000 LDRB R1,[SP, #+0]
31 b = MSB(x);
\ 0x8 0xF89D 0x2001 LDRB R2,[SP, #+1]
\ 0xC 0x7001 STRB R1,[R0, #+0]
\ 0xE 0x7042 STRB R2,[R0, #+1]
32 }
\ 0x10 0xB001 ADD SP,SP,#+4
\ 0x12 0x4770 BX LR ;; return
33
\ In section .text, align 2, keep-with-next
34 void foo1( uint16_t x )
35 {
36 a = lo(x);
\ foo1: (+1)
\ 0x0 0x.... LDR.N R1,??DataTable3
\ 0x2 0x7008 STRB R0,[R1, #+0]
37 b = hi(x);
\ 0x4 0x0A00 LSRS R0,R0,#+8
\ 0x6 0x7048 STRB R0,[R1, #+1]
38 }
\ 0x8 0x4770 BX LR ;; return
39
\ In section .text, align 2, keep-with-next
40 uint16_t bar( uint8_t hi, uint8_t lo )
41 {
\ bar: (+1)
\ 0x0 0xB081 SUB SP,SP,#+4
42 uint16_t r;
43 MSB(r) = hi;
\ 0x2 0xF88D 0x0001 STRB R0,[SP, #+1]
44 LSB(r) = lo;
\ 0x6 0xF88D 0x1000 STRB R1,[SP, #+0]
45 return r;
\ 0xA 0xF8BD 0x0000 LDRH R0,[SP, #+0]
\ 0xE 0xB001 ADD SP,SP,#+4
\ 0x10 0x4770 BX LR ;; return
46 }
47
\ In section .text, align 2, keep-with-next
48 uint16_t bar1( uint8_t hi, uint8_t lo )
49 {
50 return hi << 8 | lo;
\ bar1: (+1)
\ 0x0 0xEA41 0x2000 ORR R0,R1,R0, LSL #+8
\ 0x4 0x4770 BX LR ;; return
51 }
-
- Я имел ввиду IAR AVR. Для него "куча АСМ-кода" побольше будет. - maleon(29.04.2019 20:30)