Formatovany tisk pro 8bit

Jan Waclawek konfera na efton.sk
Úterý Duben 23 17:02:07 CEST 2024


Obsah +1 (mimochodom s tym alloca()/buf[l] sa uz staticka analyza aj tak
neda robit, rovnako staci trocha volani cez smerniky a uz je to takmer
alebo uplne nemozne); ale trocha jazykovej buzeracie: kombinacia "stack" a
"halda" mi je proti srsti... :-)

A k otazke pana kolegu Zarubu v inom maili: ano, alloca() alebo buf[l]
zvacsia zasobnik (SP = 3E:3D; pri zapise do SP sa zakazuje prerusenie
kvoli neatomicite toho zapisu) a sucasne si niekam odlozia smernik na ten
vysledny pridany objekt (v tomto pripade v pare R17:R16) -- mimochodom, v
tejto ukazje je strlen() inlineovany a na konci je inlineovana "imitovana"
funkcia print():

volatile char oc;

void print(char * s) {
  while(*s != '\0') {
    oc = *s;
    s++;
  }
}

void test_a(char * s) {
  uint32_t l;
  char * buf;

  l = strlen(s) + 1;
  buf = alloca(l);
  strcpy(buf, s);
  print(buf);
}


void test_a(char * s) {
 124:	ef 92       	push	r14
 126:	ff 92       	push	r15
 128:	0f 93       	push	r16
 12a:	1f 93       	push	r17
 12c:	cf 93       	push	r28
 12e:	df 93       	push	r29
 130:	cd b7       	in	r28, 0x3d	; 61
 132:	de b7       	in	r29, 0x3e	; 62
 134:	dc 01       	movw	r26, r24
 136:	ed b6       	in	r14, 0x3d	; 61
 138:	fe b6       	in	r15, 0x3e	; 62
  uint32_t l;
  char * buf;

  l = strlen(s) + 1;
 13a:	fc 01       	movw	r30, r24
 13c:	01 90       	ld	r0, Z+
 13e:	00 20       	and	r0, r0
 140:	e9 f7       	brne	.-6      	; 0x13c <test_a+0x18>
 142:	e8 1b       	sub	r30, r24
 144:	f9 0b       	sbc	r31, r25
  buf = alloca(l);
 146:	8d b7       	in	r24, 0x3d	; 61
 148:	9e b7       	in	r25, 0x3e	; 62
 14a:	8e 1b       	sub	r24, r30
 14c:	9f 0b       	sbc	r25, r31
 14e:	0f b6       	in	r0, 0x3f	; 63
 150:	f8 94       	cli
 152:	9e bf       	out	0x3e, r25	; 62
 154:	0f be       	out	0x3f, r0	; 63
 156:	8d bf       	out	0x3d, r24	; 61
 158:	0d b7       	in	r16, 0x3d	; 61
 15a:	1e b7       	in	r17, 0x3e	; 62
 15c:	0f 5f       	subi	r16, 0xFF	; 255
 15e:	1f 4f       	sbci	r17, 0xFF	; 255
  strcpy(buf, s);
 160:	bd 01       	movw	r22, r26
 162:	c8 01       	movw	r24, r16
 164:	0e 94 0d 01 	call	0x21a	; 0x21a <strcpy>
 168:	04 c0       	rjmp	.+8      	; 0x172 <test_a+0x4e>
volatile char oc;

void print(char * s) {
  while(*s != '\0') {
    oc = *s;
 16a:	80 93 02 02 	sts	0x0202, r24
    s++;
 16e:	0f 5f       	subi	r16, 0xFF	; 255
 170:	1f 4f       	sbci	r17, 0xFF	; 255
#include <alloca.h>  

volatile char oc;

void print(char * s) {
  while(*s != '\0') {
 172:	f8 01       	movw	r30, r16
 174:	80 81       	ld	r24, Z
 176:	88 23       	and	r24, r24
 178:	c1 f7       	brne	.-16     	; 0x16a <test_a+0x46>

  l = strlen(s) + 1;
  buf = alloca(l);
  strcpy(buf, s);
  print(buf);
}
 17a:	0f b6       	in	r0, 0x3f	; 63
 17c:	f8 94       	cli
 17e:	fe be       	out	0x3e, r15	; 62
 180:	0f be       	out	0x3f, r0	; 63
 182:	ed be       	out	0x3d, r14	; 61
 184:	df 91       	pop	r29
 186:	cf 91       	pop	r28
 188:	1f 91       	pop	r17
 18a:	0f 91       	pop	r16
 18c:	ff 90       	pop	r15
 18e:	ef 90       	pop	r14
 190:	08 95       	ret


wek


----- Original Message ---------------

>Kompilátor velikost stacku nezná. Můµe být od pár bytů na opravdu malém 
>MCU po 4MiB na vlákno v OS. Takµe to je past, předev±ím pro bare-metal a 
>C++. Můµete jednodu±e vytvořit lokální proměnnou pro objekt, který můµe 
>uvnitř obsahovat jakékoli buffery a stack přeteče. Jinak řečeno - past 
>je v tom, µe je to jednoduché a nijak to nevaruje.
>Sice existují nástroje na statickou analýzu stacku, ale co jsem to před 
>léty zkou±el, stejně to ukazovalo blbosti. Co se osvědčilo je popsat na 
>začátku celý stack nějakým vzorem, třeba 0xDEADBEEF, nechat program 
>běµet a pak se debugerem podívat, kde tento vzor končí, tedy je přepsán 
>programem. Předpokladem je, µe stack je za .bss a není mezi tím halda. 
>Pokud tam halda je, lze takto zjistit i její pouµití.
>
>Mrazík
>
>On 23. 04. 24 15:12, Martin Záruba wrote:
>> Je±tě jeden postřeh: Kompilátoru vůbec nevadí nesmyslná deklarace 
>> velikosti pole jako lokální proměnné. ...
>> 



Další informace o konferenci Hw-list