Преобразование BIN -->BCD

Возьми да скомпилируй в ардуине.

Компилятор тот же самый !!!

void setup () {
    Serial.begin(9600);
    Serial.println(F("Start"));
  d6:	68 e6       	ldi	r22, 0x68	; 104
  d8:	70 e0       	ldi	r23, 0x00	; 0
  da:	86 e1       	ldi	r24, 0x16	; 22
  dc:	91 e0       	ldi	r25, 0x01	; 1
  de:	0e 94 a1 02 	call	0x542	; 0x542 <Print::println(__FlashStringHelper const*)>
D:\SoftWare\arduino-1.8.19\portable\sketchbook\sketch_nov14a/sketch_nov14a.ino:4
    uint16_t* current_SP = (uint16_t*)SP;
  e2:	ed b7       	in	r30, 0x3d	; 61
  e4:	fe b7       	in	r31, 0x3e	; 62
D:\SoftWare\arduino-1.8.19\portable\sketchbook\sketch_nov14a/sketch_nov14a.ino:5
    Serial.println(*current_SP, HEX);
  e6:	60 81       	ld	r22, Z
  e8:	71 81       	ldd	r23, Z+1	; 0x01
  ea:	40 e1       	ldi	r20, 0x10	; 16
  ec:	50 e0       	ldi	r21, 0x00	; 0
  ee:	86 e1       	ldi	r24, 0x16	; 22
  f0:	91 e0       	ldi	r25, 0x01	; 1
  f2:	0c 94 12 03 	jmp	0x624	; 0x624 <Print::println(unsigned int, int)>

000000f6 <loop>:
loop():
D:\SoftWare\arduino-1.8.19\portable\sketchbook\sketch_nov14a/sketch_nov14a.ino:9
}

void loop() {
}

Командир, не трать времени и нервов. Дед тебя изводит просто от безделья. Хотел бы что-то доказать - сам бы компилировал.

1 лайк

Не свисти, денег не будет.
Мне самому интересно.

 asm volatile
  (
    "nop \n"    
  );
   uint16_t* current_SP = (uint16_t*)SP;

 asm volatile
  (
    "nop \n"    
  );   
}

void loop() {
  // put your main code here, to run repeatedly:

}

А это результат

Спойлер

+00000000: 940C0034 JMP 0x00000034 Jump
+00000002: 940C0046 JMP 0x00000046 Jump
+00000004: 940C0046 JMP 0x00000046 Jump
+00000006: 940C0046 JMP 0x00000046 Jump
+00000008: 940C0046 JMP 0x00000046 Jump
+0000000A: 940C0046 JMP 0x00000046 Jump
+0000000C: 940C0046 JMP 0x00000046 Jump
+0000000E: 940C0046 JMP 0x00000046 Jump
+00000010: 940C0046 JMP 0x00000046 Jump
+00000012: 940C0046 JMP 0x00000046 Jump
+00000014: 940C0046 JMP 0x00000046 Jump
+00000016: 940C0046 JMP 0x00000046 Jump
+00000018: 940C0046 JMP 0x00000046 Jump
+0000001A: 940C0046 JMP 0x00000046 Jump
+0000001C: 940C0046 JMP 0x00000046 Jump
+0000001E: 940C0046 JMP 0x00000046 Jump
+00000020: 940C0048 JMP 0x00000048 Jump
+00000022: 940C0046 JMP 0x00000046 Jump
+00000024: 940C0046 JMP 0x00000046 Jump
+00000026: 940C0046 JMP 0x00000046 Jump
+00000028: 940C0046 JMP 0x00000046 Jump
+0000002A: 940C0046 JMP 0x00000046 Jump
+0000002C: 940C0046 JMP 0x00000046 Jump
+0000002E: 940C0046 JMP 0x00000046 Jump
+00000030: 940C0046 JMP 0x00000046 Jump
+00000032: 940C0046 JMP 0x00000046 Jump
+00000034: 2411 CLR R1 Clear Register
+00000035: BE1F OUT 0x3F,R1 Out to I/O location
+00000036: EFCF SER R28 Set Register
+00000037: E0D8 LDI R29,0x08 Load immediate
+00000038: BFDE OUT 0x3E,R29 Out to I/O location
+00000039: BFCD OUT 0x3D,R28 Out to I/O location
+0000003A: E021 LDI R18,0x01 Load immediate
+0000003B: E0A0 LDI R26,0x00 Load immediate
+0000003C: E0B1 LDI R27,0x01 Load immediate
+0000003D: C001 RJMP PC+0x0002 Relative jump
+0000003E: 921D ST X+,R1 Store indirect and postincrement
+0000003F: 30A9 CPI R26,0x09 Compare with immediate
+00000040: 07B2 CPC R27,R18 Compare with carry
+00000041: F7E1 BRNE PC-0x03 Branch if not equal
+00000042: 940E0092 CALL 0x00000092 Call subroutine
+00000044: 940C00E0 JMP 0x000000E0 Jump
+00000046: 940C0000 JMP 0x00000000 Jump
+00000048: 921F PUSH R1 Push register on stack
+00000049: 920F PUSH R0 Push register on stack
+0000004A: B60F IN R0,0x3F In from I/O location
+0000004B: 920F PUSH R0 Push register on stack
+0000004C: 2411 CLR R1 Clear Register
+0000004D: 932F PUSH R18 Push register on stack
+0000004E: 933F PUSH R19 Push register on stack
+0000004F: 938F PUSH R24 Push register on stack
+00000050: 939F PUSH R25 Push register on stack
+00000051: 93AF PUSH R26 Push register on stack
+00000052: 93BF PUSH R27 Push register on stack
+00000053: 91800105 LDS R24,0x0105 Load direct from data space
+00000055: 91900106 LDS R25,0x0106 Load direct from data space
+00000057: 91A00107 LDS R26,0x0107 Load direct from data space
+00000059: 91B00108 LDS R27,0x0108 Load direct from data space
+0000005B: 91300104 LDS R19,0x0104 Load direct from data space
+0000005D: E023 LDI R18,0x03 Load immediate
+0000005E: 0F23 ADD R18,R19 Add without carry
+0000005F: 372D CPI R18,0x7D Compare with immediate
+00000060: F558 BRCC PC+0x2C Branch if carry cleared
+00000061: 9601 ADIW R24,0x01 Add immediate to word
+00000062: 1DA1 ADC R26,R1 Add with carry
+00000063: 1DB1 ADC R27,R1 Add with carry
+00000064: 93200104 STS 0x0104,R18 Store direct to data space
+00000066: 93800105 STS 0x0105,R24 Store direct to data space
+00000068: 93900106 STS 0x0106,R25 Store direct to data space
+0000006A: 93A00107 STS 0x0107,R26 Store direct to data space
+0000006C: 93B00108 STS 0x0108,R27 Store direct to data space
+0000006E: 91800100 LDS R24,0x0100 Load direct from data space
+00000070: 91900101 LDS R25,0x0101 Load direct from data space
+00000072: 91A00102 LDS R26,0x0102 Load direct from data space
+00000074: 91B00103 LDS R27,0x0103 Load direct from data space
+00000076: 9601 ADIW R24,0x01 Add immediate to word
+00000077: 1DA1 ADC R26,R1 Add with carry
+00000078: 1DB1 ADC R27,R1 Add with carry
+00000079: 93800100 STS 0x0100,R24 Store direct to data space
+0000007B: 93900101 STS 0x0101,R25 Store direct to data space
+0000007D: 93A00102 STS 0x0102,R26 Store direct to data space
+0000007F: 93B00000 STS 0x0000,R27 Store direct to data space
+00000081: 91BF POP R27 Pop register from stack
+00000082: 91AF POP R26 Pop register from stack
+00000083: 919F POP R25 Pop register from stack
+00000084: 918F POP R24 Pop register from stack
+00000085: 913F POP R19 Pop register from stack
+00000086: 912F POP R18 Pop register from stack
+00000087: 900F POP R0 Pop register from stack
+00000088: BE0F OUT 0x3F,R0 Out to I/O location
+00000089: 900F POP R0 Pop register from stack
+0000008A: 901F POP R1 Pop register from stack
+0000008B: 9518 RETI Interrupt return
+0000008C: E826 LDI R18,0x86 Load immediate
+0000008D: 0F23 ADD R18,R19 Add without carry
+0000008E: 9602 ADIW R24,0x02 Add immediate to word
+0000008F: 1DA1 ADC R26,R1 Add with carry
+00000090: 1DB1 ADC R27,R1 Add with carry
+00000091: CFD2 RJMP PC-0x002D Relative jump
+00000092: 9478 SEI Global Interrupt Enable
+00000093: B584 IN R24,0x24 In from I/O location
+00000094: 6082 ORI R24,0x02 Logical OR with immediate
+00000095: BD84 OUT 0x24,R24 Out to I/O location
+00000096: B584 IN R24,0x24 In from I/O location
+00000097: 6081 ORI R24,0x01 Logical OR with immediate
+00000098: BD84 OUT 0x24,R24 Out to I/O location
+00000099: B585 IN R24,0x25 In from I/O location
+0000009A: 6082 ORI R24,0x02 Logical OR with immediate
+0000009B: BD85 OUT 0x25,R24 Out to I/O location
+0000009C: B585 IN R24,0x25 In from I/O location
+0000009D: 6081 ORI R24,0x01 Logical OR with immediate
+0000009E: BD85 OUT 0x25,R24 Out to I/O location
+0000009F: 9180006E LDS R24,0x006E Load direct from data space
+000000A1: 6081 ORI R24,0x01 Logical OR with immediate
+000000A2: 9380006E STS 0x006E,R24 Store direct to data space
+000000A4: 92100081 STS 0x0081,R1 Store direct to data space
+000000A6: 91800081 LDS R24,0x0081 Load direct from data space
+000000A8: 6082 ORI R24,0x02 Logical OR with immediate
+000000A9: 93800081 STS 0x0081,R24 Store direct to data space
+000000AB: 91800081 LDS R24,0x0081 Load direct from data space
+000000AD: 6081 ORI R24,0x01 Logical OR with immediate
+000000AE: 93800081 STS 0x0081,R24 Store direct to data space
+000000B0: 91800080 LDS R24,0x0080 Load direct from data space
+000000B2: 6081 ORI R24,0x01 Logical OR with immediate
+000000B3: 93800080 STS 0x0080,R24 Store direct to data space
+000000B5: 918000B1 LDS R24,0x00B1 Load direct from data space
+000000B7: 6084 ORI R24,0x04 Logical OR with immediate
+000000B8: 938000B1 STS 0x00B1,R24 Store direct to data space
+000000BA: 918000B0 LDS R24,0x00B0 Load direct from data space
+000000BC: 6081 ORI R24,0x01 Logical OR with immediate
+000000BD: 938000B0 STS 0x00B0,R24 Store direct to data space
+000000BF: 91800000 LDS R24,0x0000 Load direct from data space
+000000C1: 6084 ORI R24,0x04 Logical OR with immediate
+000000C2: 9380007A STS 0x007A,R24 Store direct to data space
+000000C4: 9180007A LDS R24,0x007A Load direct from data space
+000000C6: 6082 ORI R24,0x02 Logical OR with immediate
+000000C7: 9380007A STS 0x007A,R24 Store direct to data space
+000000C9: 9180007A LDS R24,0x007A Load direct from data space
+000000CB: 6081 ORI R24,0x01 Logical OR with immediate
+000000CC: 9380007A STS 0x007A,R24 Store direct to data space
+000000CE: 9180007A LDS R24,0x007A Load direct from data space
+000000D0: 6880 ORI R24,0x80 Logical OR with immediate
+000000D1: 9380007A STS 0x007A,R24 Store direct to data space
+000000D3: 921000C1 STS 0x00C1,R1 Store direct to data space
+000000D5: 0000 NOP No operation
+000000D6: B78D IN R24,0x3D In from I/O location
+000000D7: B79E IN R25,0x3E In from I/O location
+000000D8: 0000 NOP No operation
+000000D9: E0C0 LDI R28,0x00 Load immediate
+000000DA: E0D0 LDI R29,0x00 Load immediate
+000000DB: 9720 SBIW R28,0x00 Subtract immediate from word
+000000DC: F3F1 BREQ PC-0x01 Branch if equal
+000000DD: 940E0000 CALL 0x00000000 Call subroutine
+000000DF: CFFB RJMP PC-0x0004 Relative jump
+000000E0: 94F8 CLI Global Interrupt Disable
+000000E1: CFFF RJMP PC-0x0000 Relative jump
+000000E2: FFFF

Ну так вы никакой операции не производите с полученным значением …
Если оптимизацию включить - компилятор вообще выкинет это из кода …

1 лайк

Ничто не вечно под Луной… и регистры тоже)
А можно для примера регистры вечные привести?

R2 всегда ноль. :stuck_out_tongue:

И причём здесь куча инициализационных действий и векторов прерываний? Покажи конкретный участок.
Всё, вижу. И? То же самое…)

У вас гранаты не той системы !!!

__tmp_reg__ Register R0, used for temporary storage
__zero_reg__ Register R1, always zero

Скорее, система не та, а гранаты-то правильные :slight_smile:

R1, идиот

Так нужно же посмотреть кто читал, а кто нет. Сразу видно, кто то впервые увидел.
avr-gcc#Register_Layout

Вот и меня этот вопрос интересует. Весь скетч перед глазами- нет в нем никаких инициализаций и прерываний, а компилятор ардуиновкий вставляет кучу мусора. Откуда он это берет? Как это убрать?

Не пишите в концепции setup loop …
Пишите в концепции main и если вам нужны таймеры (для того же millis), то инициализируйте их сами !

Избалованы Ардуиной, понимаешь ли.)

Надо уметь смотреть в лог компилятора, а не только стеком размахивать.
Там все написано - какие файлы обрабатываются. Потом уже просто соображалку включить ненадолго, а не собачиться с командиром за асм.

Не хочешь лишнего - компилируй начисто с gcc, а не лезь во фреймворки. Тогда, быть может, нервы в порядок приведешь и на c++ не будешь напрыгивать без повода.

Видимо, Петрович прав - взял инструмент,
которым пользоваться не умеешь, бьешь себя по пальцам, а все вокруг в этом виноваты.

3 лайка

Так это ж…)
Багажник знаний какой то нужно иметь. И не только ТЕХ времён.

Мне всегда студенты нравятся. Точнее, не они, а их преподы. Ну ТАКУЮ древность студентам задают (типа 8080 или 8051)! Понятно что это классика, но это и говорит об уровне развития этих всех преподов. Они застыли ещё во всех этих веках.

"** Хороший Сагиб у Сами и умный, Только больно дерется стеком**

Спорить нет возможности. Как трудовик школьный всю жись киянкой стучит и выжигать учит.

Ещё лет пять назад позвал меня такой препод-дед на кафедру механики. КТН-ов там хоть разноси по домам. Решили они там удивить всех стендом измерения вращения какой-то хероты. Нашли в подвалах железяки, какой-то непонятный спидометр, на соплях привесили геркон, на вал - магнит. А оно у них космическую скорость показывает и в ERR уходит на разгоне.
Прихожу, смотрю, беру осциллографа, а там - мать честная. Монтаж как в китайском приёмнике из 90х. Скрутки, изолента, геркон троит, контакт пропадает.
Еб…
И все с бородами сидят, мастера. Лекции годами читают.

3 лайка