Код:
/usr/share/arduino/arduino-builder -dump-prefs -logger=machine -hardware /usr/share/arduino/hardware -hardware /home/oleg/.arduino15/packages -tools /home/oleg/.arduino15/packages -libraries /home/oleg/Arduino/libraries -fqbn=MicroCore:avr:13:clock=9M6,eeprom=keep,BOD=2v7,bootloader=no_bootloader -ide-version=10819 -build-path /tmp/arduino_build_149944 -warnings=none -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=/home/oleg/.arduino15/packages/MicroCore/tools/avrdude/7.1-arduino.1 -prefs=runtime.tools.avrdude-7.1-arduino.1.path=/home/oleg/.arduino15/packages/MicroCore/tools/avrdude/7.1-arduino.1 -prefs=runtime.tools.arduinoOTA.path=/home/oleg/.arduino15/packages/arduino/tools/arduinoOTA/1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=/home/oleg/.arduino15/packages/arduino/tools/arduinoOTA/1.3.0 -prefs=runtime.tools.avr-gcc.path=/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7 -verbose /home/oleg/Arduino/sketch_may21a/sketch_may21a.ino
/usr/share/arduino/arduino-builder -compile -logger=machine -hardware /usr/share/arduino/hardware -hardware /home/oleg/.arduino15/packages -tools /home/oleg/.arduino15/packages -libraries /home/oleg/Arduino/libraries -fqbn=MicroCore:avr:13:clock=9M6,eeprom=keep,BOD=2v7,bootloader=no_bootloader -ide-version=10819 -build-path /tmp/arduino_build_149944 -warnings=none -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=/home/oleg/.arduino15/packages/MicroCore/tools/avrdude/7.1-arduino.1 -prefs=runtime.tools.avrdude-7.1-arduino.1.path=/home/oleg/.arduino15/packages/MicroCore/tools/avrdude/7.1-arduino.1 -prefs=runtime.tools.arduinoOTA.path=/home/oleg/.arduino15/packages/arduino/tools/arduinoOTA/1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=/home/oleg/.arduino15/packages/arduino/tools/arduinoOTA/1.3.0 -prefs=runtime.tools.avr-gcc.path=/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7 -verbose /home/oleg/Arduino/sketch_may21a/sketch_may21a.ino
Using board '13' from platform in folder: /home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0
Using core 'microcore' from platform in folder: /home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0
Detecting libraries used...
/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -E -CC -mmcu=attiny13a -DF_CPU=9600000L -DARDUINO=10819 -DARDUINO_attiny -DARDUINO_ARCH_AVR -I/home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/cores/microcore -I/home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/variants/attiny13a /tmp/arduino_build_149944/sketch/sketch_may21a.ino.cpp -o /dev/null -DARDUINO_LIB_DISCOVERY_PHASE
Generating function prototypes...
/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -E -CC -mmcu=attiny13a -DF_CPU=9600000L -DARDUINO=10819 -DARDUINO_attiny -DARDUINO_ARCH_AVR -I/home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/cores/microcore -I/home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/variants/attiny13a /tmp/arduino_build_149944/sketch/sketch_may21a.ino.cpp -o /tmp/arduino_build_149944/preproc/ctags_target_for_gcc_minus_e.cpp -DARDUINO_LIB_DISCOVERY_PHASE
/usr/bin/arduino-ctags -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives /tmp/arduino_build_149944/preproc/ctags_target_for_gcc_minus_e.cpp
Compiling sketch...
/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=attiny13a -DF_CPU=9600000L -DARDUINO=10819 -DARDUINO_attiny -DARDUINO_ARCH_AVR -I/home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/cores/microcore -I/home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/variants/attiny13a /tmp/arduino_build_149944/sketch/sketch_may21a.ino.cpp -o /tmp/arduino_build_149944/sketch/sketch_may21a.ino.cpp.o
Compiling libraries...
Compiling core...
Using previously compiled file: /tmp/arduino_build_149944/core/pcrt.S.o
Using previously compiled file: /tmp/arduino_build_149944/core/millis.S.o
Using previously compiled file: /tmp/arduino_build_149944/core/wiring.c.o
Using previously compiled file: /tmp/arduino_build_149944/core/wiring_analog.c.o
Using previously compiled file: /tmp/arduino_build_149944/core/WInterrupts.c.o
Using previously compiled file: /tmp/arduino_build_149944/core/wiring_digital.c.o
Using previously compiled file: /tmp/arduino_build_149944/core/wiring_pwm.c.o
Using previously compiled file: /tmp/arduino_build_149944/core/wiring_shift.c.o
Using previously compiled file: /tmp/arduino_build_149944/core/wiring_pulse.c.o
Using previously compiled file: /tmp/arduino_build_149944/core/Print.cpp.o
Using previously compiled file: /tmp/arduino_build_149944/core/Tone.cpp.o
Using previously compiled file: /tmp/arduino_build_149944/core/WMath.cpp.o
Using previously compiled file: /tmp/arduino_build_149944/core/WString.cpp.o
Using previously compiled file: /tmp/arduino_build_149944/core/main.cpp.o
Using previously compiled file: /tmp/arduino_build_149944/core/HalfDuplexSerial.cpp.o
Using previously compiled file: /tmp/arduino_build_149944/core/micros.cpp.o
Using previously compiled file: /tmp/arduino_build_149944/core/picoUART.cpp.o
Using previously compiled file: /tmp/arduino_build_149944/core/picoUART_rxISR.cpp.o
Using previously compiled file: /tmp/arduino_build_149944/core/core.a
Linking everything together...
/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-gcc -w -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -g -fuse-linker-plugin -Wl,--gc-sections -mrelax -mmcu=attiny13a -nostartfiles -Wl,--undefined=__vectors -o /tmp/arduino_build_149944/sketch_may21a.ino.elf /tmp/arduino_build_149944/sketch/sketch_may21a.ino.cpp.o /tmp/arduino_build_149944/core/core.a -L/tmp/arduino_build_149944 -lm
/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 /tmp/arduino_build_149944/sketch_may21a.ino.elf /tmp/arduino_build_149944/sketch_may21a.ino.eep
/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy -O ihex -R .eeprom /tmp/arduino_build_149944/sketch_may21a.ino.elf /tmp/arduino_build_149944/sketch_may21a.ino.hex
chmod +x /home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/scripts/create_disassembler_listing.sh
/home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/scripts/create_disassembler_listing.sh /home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-objdump "--disassemble --source --line-numbers --demangle --section=.text" /tmp/arduino_build_149944/sketch_may21a.ino.elf /tmp/arduino_build_149944/sketch_may21a.ino_attiny13a_9600000L.lst
/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-size -A /tmp/arduino_build_149944/sketch_may21a.ino.elf
Sketch uses 192 bytes (18%) of program storage space. Maximum is 1024 bytes.
Global variables use 0 bytes (0%) of dynamic memory, leaving 64 bytes for local variables. Maximum is 64 bytes.
экспорт "бинарного файла"
дизассемблирование c комментариями
Код:
avr-objdump -mavr -D sketch_may21a.ino_attiny13a_9600000L.hex
00000000 <.sec1>:
ЭТО ТАБЛИЦА ВЕКТОРОВ
0: 0a c0 rjmp .+20 ; 0x16
2: 08 c0 rjmp .+16 ; 0x14
4: 07 c0 rjmp .+14 ; 0x14
6: 06 c0 rjmp .+12 ; 0x14
8: 05 c0 rjmp .+10 ; 0x14
a: 04 c0 rjmp .+8 ; 0x14
c: 03 c0 rjmp .+6 ; 0x14
e: 02 c0 rjmp .+4 ; 0x14
10: 01 c0 rjmp .+2 ; 0x14
12: 00 c0 rjmp .+0 ; 0x14
14: 18 95 reti
ОБЫЧНО ОПРЕДЕЛЯЕТСЯ СТЕК, СБРАСЫВАЕТСЯ РЕГИСТР СТАТУСА И Т.П.
16: 11 24 eor r1, r1
18: cf 93 push r28
1a: df 93 push r29
1c: cd b7 in r28, 0x3d ; 61
1e: dd 27 eor r29, r29
20: c0 51 subi r28, 0x10 ; 16
22: cd bf out 0x3d, r28 ; 61
24: 78 94 sei
ЗАГРУЖАЮТСЯ РЕГИСТРЫ ДАННЫМИ ДЛЯ ОПЕРАЦИИ ДЕЛЕНИЯ И ПОМЕЩАЮТСЯ В ПАМЯТЬ
формируем и пишем в память 900000000
26: 80 e0 ldi r24, 0x00 ; 0
28: 99 ee ldi r25, 0xE9 ; 233
2a: a4 ea ldi r26, 0xA4 ; 164
2c: b5 e3 ldi r27, 0x35 ; 53
2e: 8d 87 std Y+13, r24 ; 0x0d
30: 9e 87 std Y+14, r25 ; 0x0e
32: af 87 std Y+15, r26 ; 0x0f
34: b8 8b std Y+16, r27 ; 0x10
формируем и пишем в память 25000000
36: 80 e4 ldi r24, 0x40 ; 64
38: 98 e7 ldi r25, 0x78 ; 120
3a: ad e7 ldi r26, 0x7D ; 125
3c: b1 e0 ldi r27, 0x01 ; 1
3e: 89 87 std Y+9, r24 ; 0x09
40: 9a 87 std Y+10, r25 ; 0x0a
42: ab 87 std Y+11, r26 ; 0x0b
44: bc 87 std Y+12, r27 ; 0x0c
900000000, и 25000000 тоже, читаем обратно из памяти, хотя нехватки регистров не было (:
46: 6d 85 ldd r22, Y+13 ; 0x0d
48: 7e 85 ldd r23, Y+14 ; 0x0e
4a: 8f 85 ldd r24, Y+15 ; 0x0f
4c: 98 89 ldd r25, Y+16 ; 0x10
4e: 29 85 ldd r18, Y+9 ; 0x09
50: 3a 85 ldd r19, Y+10 ; 0x0a
52: 4b 85 ldd r20, Y+11 ; 0x0b
54: 5c 85 ldd r21, Y+12 ; 0x0c
ВЫПОЛНЯЕТСЯ ДЕЛЕНИЕ
56: 12 d0 rcall .+36 ; 0x7c
СОХРАНЯЕТСЯ ОДИН ИЗ РЕЗУЛЬТАТОВ ДЕЛЕНИЯ В ПАМЯТЬ (остальные игнорируются)
58: 2d 83 std Y+5, r18 ; 0x05
5a: 3e 83 std Y+6, r19 ; 0x06
5c: 4f 83 std Y+7, r20 ; 0x07
5e: 58 87 std Y+8, r21 ; 0x08
СНОВА ЧИТАЮТСЯ ИЗ ПАМЯТИ ОПЕРАНДЫ ДЛЯ ДЕЛЕНИЯ
900000000
60: 6d 85 ldd r22, Y+13 ; 0x0d
62: 7e 85 ldd r23, Y+14 ; 0x0e
64: 8f 85 ldd r24, Y+15 ; 0x0f
66: 98 89 ldd r25, Y+16 ; 0x10
25000000
68: 29 85 ldd r18, Y+9 ; 0x09
6a: 3a 85 ldd r19, Y+10 ; 0x0a
6c: 4b 85 ldd r20, Y+11 ; 0x0b
6e: 5c 85 ldd r21, Y+12 ; 0x0c
СНОВА ВЫПОЛНЯЕТСЯ ДЕЛЕНИЕ
70: 05 d0 rcall .+10 ; 0x7c
СНОВА СОХРАНЯЕТСЯ ОДИН ИЗ РЕЗУЛЬТАТОВ В ПАМЯТЬ
72: 69 83 std Y+1, r22 ; 0x01
74: 7a 83 std Y+2, r23 ; 0x02
76: 8b 83 std Y+3, r24 ; 0x03
78: 9c 83 std Y+4, r25 ; 0x04
7a: ff cf rjmp .-2 ; 0x7a
это сама ПОДПРОГРАММА ДЕЛЕНИЯ (около 66 команд с циклом 32 прохода в середине
19 команд, ну пусть будут по одному такту все, итого 19*32=608 тактов,
плюс лишний раз подготовка операндов, и.. два раза два раза.
7c: a1 e2 ldi r26, 0x21 ; 33
7e: 1a 2e mov r1, r26
80: aa 1b sub r26, r26
82: bb 1b sub r27, r27
84: fd 01 movw r30, r26
86: 0d c0 rjmp .+26 ; 0xa2
88: aa 1f adc r26, r26 <---------------
8a: bb 1f adc r27, r27
8c: ee 1f adc r30, r30
8e: ff 1f adc r31, r31
90: a2 17 cp r26, r18
92: b3 07 cpc r27, r19
94: e4 07 cpc r30, r20
96: f5 07 cpc r31, r21
98: 20 f0 brcs .+8 ; 0xa2
9a: a2 1b sub r26, r18
9c: b3 0b sbc r27, r19
9e: e4 0b sbc r30, r20
a0: f5 0b sbc r31, r21
a2: 66 1f adc r22, r22
a4: 77 1f adc r23, r23
a6: 88 1f adc r24, r24
a8: 99 1f adc r25, r25
aa: 1a 94 dec r1
ac: 69 f7 brne .-38 ; 0x88 -------->
ae: 60 95 com r22
b0: 70 95 com r23
b2: 80 95 com r24
b4: 90 95 com r25
b6: 9b 01 movw r18, r22
b8: ac 01 movw r20, r24
ba: bd 01 movw r22, r26
bc: cf 01 movw r24, r30
be: 08 95 ret
1. 32 битное деление можно сделать на регистрах общего назначения без обращения к памяти
2. можно разделить один раз.
неверная аналогия для двоичного деления, но как бы здесь это не важно:
1. отнимаем в цикле делитель от делимого пока не получим нехватку делимого для очередного отнимания
2. подсчитанное количество проделанных циклов отнимания = целая часть
3. то негодное для отнимания, что осталось от делимого, т.е. остаток = числитель дроби
4. то, на что делили (что отнимали) это делитель = основание или знаменатель дроби
Все необходимое имеем в конце первой операции в виде 4+4+4= 12 регистров или ячеек памяти.
Что делаем? Правильно, сохраняем целую часть, удаляем остаток для того, чтобы сразу же начать его вычислять .
Microcore, attiny13, параметры компиляции и сборки выше.