Re: Jak to v C++ napsat líp?
Jan Waclawek
konfera na efton.sk
Čtvrtek Srpen 31 12:50:46 CEST 2023
Toto je povodny program (po doplneni "obalu"):
int A[2];
int main(void) {
A[0] = ('A' << 8) | 'B';
A[1] = ('C' << 8) | 'D';
while(1);
}
a takto sa prelozi:
11 main:
12 /* prologue: function */
13 /* frame size = 0 */
14 /* stack size = 0 */
15 .L__stack_usage = 0
16 0000 82E4 ldi r24,lo8(66)
17 0002 91E4 ldi r25,lo8(65)
18 0004 9093 0000 sts A+1,r25
19 0008 8093 0000 sts A,r24
20 000c 84E4 ldi r24,lo8(68)
21 000e 93E4 ldi r25,lo8(67)
22 0010 9093 0000 sts A+2+1,r25
23 0014 8093 0000 sts A+2,r24
24 .L2:
25 0018 00C0 rjmp .L2
t.j. na adrese (A + 0) je 66 (='B'), (A + 1) je 65 = ('A'), (A + 2) je 68
('D'), (A + 3) je 67 ('C').
To je u mna "BADC".
>Takµe kdyµ se to pak má někam poslat
>client.write((byte*)A,počet_znaků);
>tak je lep±í to psát normálně, ne?
Zase narazame na otazku, co je to "normalne"... :-)
Ak je na druhej strane prijimac, co otaca endianitu 16-bitovych slov, tak
toto prekvapujuco moze byt "normalne".
S niecim obdobnym bojuje clovek, ak pouziva I2S, kde sa po zbernici prenasa
vzorka (jedneho z dvoch striedajucich sa kanalov) ako 32 bitov (MSB first,
LSB 8 bitov su nuly), SPI/I2S v STM32 to prijme ako dve 16-bitove slova a
cez DMA to "nejako" ulozi do pamate; odkial to treba vhodne vyzdvihnut a
ako 24 bitov poslat cez USB...
wek
----- Original Message ---------------
>Proč by měl pouµívat "BADC"? Ve výpisu assembleru se mi zdálo, µe ty bajty nepřehazuje (a tak by to taky mělo být).
>Takµe kdyµ se to pak má někam poslat
>client.write((byte*)A,počet_znaků);
>tak je lep±í to psát normálně, ne?
>
>Nebo mi něco uniká, či je něco jinak?
>P.
>
>
>Jan Waclawek napsal(a) dne 31. 08. 23 v 10:25:
>> ...
>> Vsimnite si, ze znova kvoli endianite bolo treba pouzit
>> memcpy((unsigned char *)A, "BADC", 4);
Další informace o konferenci Hw-list