Но обовсём по порядку.
1) В препрессоре не работают конструкции
Файл: global.inc(образец)
{$ifdef icpdas}
{ $E+ $N- $G- $I- $L- $D-}
{$i icpdas.inc}
{$else}
{$define dpmi}
{$i pc.inc}
{$endif}
Вложение нескольких include похоже больше не работают, так как define в них объявленные, к сожалению, теряются. Несколько вложенных {$ifdef XXX} вызывают у препрессора проблемы.
2) Работа с динамической памятью вызывает некоторые проблемы. В unit(ах) в секции инициализации нельзя выделять память без указания в этом модуле(uses heapmgr)
так как вызов GetMem осуществляется без менеджера памяти, что приводит к краху программы. На мой вкус, если в программе в принципе встречаются функции работы с динамической памятью, то модуль heapmgr должен быть вызван первым в списке инициализации модулей программы.
- Код: Выделить всё
- 00000234 <FPC_INIT_FUNC_TABLE>:
 234: 0e 94 9a 35 call 0x6b34 ; 0x6b34 <MSTIMER_ss_inits>
 238: 0e 94 98 3c call 0x7930 ; 0x7930 <HEAPMGR_ss_inits>
 23c: 0e 94 5e 34 call 0x68bc ; 0x68bc <SOCKETS_ss_inits>
 240: 0e 94 16 53 call 0xa62c ; 0xa62c <UDP_ss_inits>
 244: 0e 94 04 6f call 0xde08 ; 0xde08 <TCP_ss_inits>
 248: 0e 94 8a 6f call 0xdf14 ; 0xdf14 <DNS_ss_inits>
 24c: 0e 94 93 43 call 0x8726 ; 0x8726 <ARP_ss_inits>
 250: 0e 94 c1 2f call 0x5f82 ; 0x5f82 <IP_ss_inits>
 254: 0e 94 9e 18 call 0x313c ; 0x313c <NETWORK_ss_inits>
 258: 08 95 ret
Очень не хватает функции возвращающей размер свободной памяти.
Текущий порядок инициализации модулей:
3) При компиляции(даже без оптимизации) возникают внутренние ошибки типа 2017091103. Ругань на код абсолютно чистый и проверенный Borland.
Пример:
- Код: Выделить всё
- ($ifdef dontfragment}
 if more_fragment or (FragmentOffset <> 0)
 then begin
 { - Treatment of fragmented IP datagrams - }
 IP_CheckDatagrams();
 IP_ProcessFragment(last_packet^.Id, last_packet^.Protocol, last_packet^.SourceIP,
 last_packet^.TargetIP, PData^, DataLen, FragmentOffset, not more_fragment);
 IP_CheckDatagrams();
 end else {$endif}
 IP_ProcessDatagram(last_packet^.Protocol, last_packet^.SourceIP, last_packet^.TargetIP, PData^, DataLen);
Пришлось отрезать обработчик фрагментированных пакетов и ошибка пропала. Чистка и пересборка тут не помогают.
4) Теперь о самом неприятном. Когда программа собралась и не вроде как работает то вроде как счастье, код то был отлажен и... Ничего не работает.
Нормального отладчика нет. Только серийный порт и светодиоды на борде. Вобщем нашел проблему которую и не ожидал. Это оказалась передача параметров в процедуру. Передаешь одни параметры, получаешь внутри другие. Изначально было так :
- Код: Выделить всё
- list := ProtocolList;
 while list <> nil
 do begin
 PE := List^.data;
 if (PE^.Adapter = Adapter) and (PE^.ProtocolType = ARPPacket^.ProtocolType)
 then begin
 PE^.Routine(Adapter, Packet.Header.SourceAddr, ARPPacket^.Operation, ARPPacket^.PLEN,
 ARPPacket^.ARPData.SenderMAC, ARPPacket^.ARPData.SenderIP,
 ARPPacket^.ARPData.TargetMAC, ARPPacket^.ARPData.TargetIP);
 end;
 list := list^.next;
 end;
Внутри процедуры обнаруживаешь искажённую ARPPacket^.ARPData.TargetIP. Значение произвольное, оно меняется при изменении кода с последующей перекомпиляцией. Ладно. Может не нравится динамический вызов процедуры из структуры и переписал. Вместо переменных с IP адресом вставил константы.
- Код: Выделить всё
- if typeLEN_IP = ARPPacket^.ProtocolType
 then begin
 ProcessARP(Adapter, Packet.Header.SourceAddr, ARPPacket^.Operation, ARPPacket^.PLEN,
 ARPPacket^.ARPData.SenderMAC, $590AA8C0 {ARPPacket^.ARPData.SenderIP},
 ARPPacket^.ARPData.TargetMAC, $590AA8C0 {ARPPacket^.ARPData.TargetIP});
 end;
Собственно процедура:
- Код: Выделить всё
- procedure ProcessARP(Adapter : PNetworkAdapter; const SourceEtherAddr : TMACAddress; Operation : word; PLEN: byte;
 const SenderHA : TMACAddress; SenderPA: TIPAddress;
 const TargetHA : TMACAddress; TargetPA: TIPAddress);
 begin
 writeln('After sender : '+ MACToStr(SenderHA)+ ' ('+ inet_ntoa(SenderPA)+ ') '+ hexl(SenderPA));
 writeln('After target : '+ MACToStr(TargetHA)+ ' ('+ inet_ntoa(TargetPA)+ ') '+ hexl(TargetPA));
 ...
Результат :
Setting for adapter : ENC28J60
MAC : 01:02:03:04:05:06
IP Address : 192.168.10.35
Network mask: 255.255.255.0
Gateway : 192.168.10.1
DNS : 8.8.8.8
Destination Mask Gateway IP Local Charge
--------------- --------------- --------------- --------------- -----
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 0
192.168.10.35 255.255.255.255 127.0.0.1 127.0.0.1 0
192.168.10.0 255.255.255.0 192.168.10.35 192.168.10.35 0
0.0.0.0 0.0.0.0 192.168.10.1 192.168.10.35 9999
After sender : E0:D5:5E:C3:52:30 (192.168.10.89) 590AA8C0
After target : 00:00:00:00:00:00 (0.0.0.10) 0A000000
Теперь это можно дизасемблить.
Вызов процедуры :
- Код: Выделить всё
- ProcessARP(Adapter, Packet.Header.SourceAddr, ARPPacket^.Operation, ARPPacket^.PLEN,
 7fcc: a0 ec ldi r26, 0xC0 ; 192
 7fce: 2a 2f mov r18, r26
 7fd0: a8 ea ldi r26, 0xA8 ; 168
 7fd2: 3a 2f mov r19, r26
 7fd4: aa e0 ldi r26, 0x0A ; 10
 7fd6: 4a 2f mov r20, r26
 7fd8: a9 e5 ldi r26, 0x59 ; 89
 7fda: 5a 2f mov r21, r26
 7fdc: ed 2d mov r30, r13
 7fde: fe 2d mov r31, r14
 7fe0: 20 83 st Z, r18
 7fe2: 31 83 std Z+1, r19 ; 0x01
 7fe4: 42 83 std Z+2, r20 ; 0x02
 7fe6: 53 83 std Z+3, r21 ; 0x03
 7fe8: 2a 85 ldd r18, Y+10 ; 0x0a
 7fea: 3b 85 ldd r19, Y+11 ; 0x0b
 7fec: e2 2f mov r30, r18
 7fee: f3 2f mov r31, r19
 7ff0: 25 81 ldd r18, Z+5 ; 0x05
 7ff2: 3a 85 ldd r19, Y+10 ; 0x0a
 7ff4: 5b 85 ldd r21, Y+11 ; 0x0b
 7ff6: e3 2f mov r30, r19
 7ff8: f5 2f mov r31, r21
 7ffa: 46 81 ldd r20, Z+6 ; 0x06
 7ffc: e3 2f mov r30, r19
 7ffe: f5 2f mov r31, r21
 8000: 57 81 ldd r21, Z+7 ; 0x07
 ARPPacket^.ARPData.SenderMAC, $590AA8C0 {ARPPacket^.ARPData.SenderIP},
 ARPPacket^.ARPData.TargetMAC, $590AA8C0 {ARPPacket^.ARPData.TargetIP});
 8002: 7a 85 ldd r23, Y+10 ; 0x0a
 8004: 8b 85 ldd r24, Y+11 ; 0x0b
 ProcessARP(Adapter, Packet.Header.SourceAddr, ARPPacket^.Operation, ARPPacket^.PLEN,
 8006: 62 e1 ldi r22, 0x12 ; 18
 8008: 30 e0 ldi r19, 0x00 ; 0
 800a: 67 0f add r22, r23
 800c: 38 1f adc r19, r24
 800e: a6 2e mov r10, r22
 8010: b3 2e mov r11, r19
 ARPPacket^.ARPData.SenderMAC, $590AA8C0{ARPPacket^.ARPData.SenderIP},
 8012: 3a 85 ldd r19, Y+10 ; 0x0a
 8014: 6b 85 ldd r22, Y+11 ; 0x0b
 ProcessARP(Adapter, Packet.Header.SourceAddr, ARPPacket^.Operation, ARPPacket^.PLEN,
 8016: 08 e0 ldi r16, 0x08 ; 8
 8018: 10 e0 ldi r17, 0x00 ; 0
 801a: 03 0f add r16, r19
 801c: 16 1f adc r17, r22
 801e: 38 85 ldd r19, Y+8 ; 0x08
 8020: 89 85 ldd r24, Y+9 ; 0x09
 8022: 66 e0 ldi r22, 0x06 ; 6
 8024: 70 e0 ldi r23, 0x00 ; 0
 8026: 63 0f add r22, r19
 8028: 78 1f adc r23, r24
 802a: 8e 81 ldd r24, Y+6 ; 0x06
 802c: 9f 81 ldd r25, Y+7 ; 0x07
 802e: a0 ec ldi r26, 0xC0 ; 192
 8030: ca 2e mov r12, r26
 8032: a8 ea ldi r26, 0xA8 ; 168
 8034: da 2e mov r13, r26
 8036: aa e0 ldi r26, 0x0A ; 10
 8038: ea 2e mov r14, r26
 803a: a9 e5 ldi r26, 0x59 ; 89
 803c: fa 2e mov r15, r26
 803e: 0e 94 8d 3d call 0x7b1a ; 0x7b1a <ARP_ss_PROCESSARPscrcEB739556>
 ...
Процедура :
- Код: Выделить всё
- 00007b1a <ARP_ss_PROCESSARPscrcEB739556>:
 procedure ProcessARP(Adapter : PNetworkAdapter; const SourceEtherAddr : TMACAddress; Operation : word; PLEN: byte;
 const SenderHA : TMACAddress; SenderPA: TIPAddress;
 const TargetHA : TMACAddress; TargetPA: TIPAddress);
 begin
 7b1a: df 93 push r29
 7b1c: cf 93 push r28
 7b1e: 1f 93 push r17
 7b20: 0f 93 push r16
 7b22: ff 92 push r15
 7b24: ef 92 push r14
 7b26: df 92 push r13
 7b28: cf 92 push r12
 7b2a: bf 92 push r11
 7b2c: af 92 push r10
 7b2e: 9f 92 push r9
 7b30: 8f 92 push r8
 7b32: cd b7 in r28, 0x3d ; 61
 7b34: de b7 in r29, 0x3e ; 62
 7b36: c2 53 subi r28, 0x32 ; 50
 7b38: d4 40 sbci r29, 0x04 ; 4
 7b3a: 0f b6 in r0, 0x3f ; 63
 7b3c: f8 94 cli
 7b3e: de bf out 0x3e, r29 ; 62
 7b40: 0f be out 0x3f, r0 ; 63
 7b42: cd bf out 0x3d, r28 ; 61
 7b44: 8e 83 std Y+6, r24 ; 0x06
 7b46: 9f 83 std Y+7, r25 ; 0x07
 7b48: 68 87 std Y+8, r22 ; 0x08
 7b4a: 79 87 std Y+9, r23 ; 0x09
 7b4c: 4a 87 std Y+10, r20 ; 0x0a
 7b4e: 5b 87 std Y+11, r21 ; 0x0b
 7b50: 2c 87 std Y+12, r18 ; 0x0c
 7b52: 0d 87 std Y+13, r16 ; 0x0d
 7b54: 1e 87 std Y+14, r17 ; 0x0e
 7b56: cf 86 std Y+15, r12 ; 0x0f
 7b58: d8 8a std Y+16, r13 ; 0x10
 7b5a: e9 8a std Y+17, r14 ; 0x11
 7b5c: fa 8a std Y+18, r15 ; 0x12
 7b5e: ab 8a std Y+19, r10 ; 0x13
 7b60: bc 8a std Y+20, r11 ; 0x14
 7b62: 0a 80 ldd r0, Y+2 ; 0x02
 7b64: 0d 8a std Y+21, r0 ; 0x15
 7b66: 0b 80 ldd r0, Y+3 ; 0x03
 7b68: 0e 8a std Y+22, r0 ; 0x16
 7b6a: 0c 80 ldd r0, Y+4 ; 0x04
 7b6c: 0f 8a std Y+23, r0 ; 0x17
 7b6e: 0d 80 ldd r0, Y+5 ; 0x05
 7b70: 08 8e std Y+24, r0 ; 0x18
 writeln('After sender : '+ MACToStr(SenderHA)+ ' ('+ inet_ntoa(SenderPA)+ ') '+ hexl(SenderPA));
 7b72: 2b e2 ldi r18, 0x2B ; 43
 7b74: 34 e0 ldi r19, 0x04 ; 4
 7b76: e9 e1 ldi r30, 0x19 ; 25
 7b78: f1 e0 ldi r31, 0x01 ; 1
 7b7a: ec 0f add r30, r28
 7b7c: fd 1f adc r31, r29
 7b7e: 21 93 st Z+, r18
 7b80: 30 83 st Z, r19
 7b82: 6d 85 ldd r22, Y+13 ; 0x0d
 7b84: 7e 85 ldd r23, Y+14 ; 0x0e
 7b86: 85 e2 ldi r24, 0x25 ; 37
 7b88: 91 e0 ldi r25, 0x01 ; 1
 7b8a: 8c 0f add r24, r28
 7b8c: 9d 1f adc r25, r29
 7b8e: 0e 94 a7 14 call 0x294e ; 0x294e <NETWORK_ss_MACTOSTRsTMACADDRESSssSHORTSTRING>
 7b92: 25 e2 ldi r18, 0x25 ; 37
 7b94: 31 e0 ldi r19, 0x01 ; 1
 7b96: 2c 0f add r18, r28
 7b98: 3d 1f adc r19, r29
 7b9a: eb e1 ldi r30, 0x1B ; 27
 7b9c: f1 e0 ldi r31, 0x01 ; 1
 7b9e: ec 0f add r30, r28
 7ba0: fd 1f adc r31, r29
 7ba2: 21 93 st Z+, r18
 7ba4: 30 83 st Z, r19
 7ba6: 3c e3 ldi r19, 0x3C ; 60
 7ba8: 24 e0 ldi r18, 0x04 ; 4
 7baa: ed e1 ldi r30, 0x1D ; 29
 7bac: f1 e0 ldi r31, 0x01 ; 1
 7bae: ec 0f add r30, r28
 7bb0: fd 1f adc r31, r29
 7bb2: 31 93 st Z+, r19
 7bb4: 20 83 st Z, r18
 7bb6: 4f 85 ldd r20, Y+15 ; 0x0f
 7bb8: 58 89 ldd r21, Y+16 ; 0x10
 7bba: 69 89 ldd r22, Y+17 ; 0x11
 7bbc: 7a 89 ldd r23, Y+18 ; 0x12
 7bbe: 85 e2 ldi r24, 0x25 ; 37
 7bc0: 92 e0 ldi r25, 0x02 ; 2
 7bc2: 8c 0f add r24, r28
 7bc4: 9d 1f adc r25, r29
 7bc6: 0e 94 46 33 call 0x668c ; 0x668c <SOCKETS_ss_INET_NTOAsLONGWORDssSHORTSTRING>
 7bca: 25 e2 ldi r18, 0x25 ; 37
 7bcc: 32 e0 ldi r19, 0x02 ; 2
 7bce: 2c 0f add r18, r28
 7bd0: 3d 1f adc r19, r29
 7bd2: ef e1 ldi r30, 0x1F ; 31
 7bd4: f1 e0 ldi r31, 0x01 ; 1
 7bd6: ec 0f add r30, r28
 7bd8: fd 1f adc r31, r29
 7bda: 21 93 st Z+, r18
 7bdc: 30 83 st Z, r19
 7bde: 20 e4 ldi r18, 0x40 ; 64
 7be0: 34 e0 ldi r19, 0x04 ; 4
 7be2: e1 e2 ldi r30, 0x21 ; 33
 7be4: f1 e0 ldi r31, 0x01 ; 1
 7be6: ec 0f add r30, r28
 7be8: fd 1f adc r31, r29
 7bea: 21 93 st Z+, r18
 7bec: 30 83 st Z, r19
 7bee: 4f 85 ldd r20, Y+15 ; 0x0f
 7bf0: 58 89 ldd r21, Y+16 ; 0x10
 7bf2: 69 89 ldd r22, Y+17 ; 0x11
 7bf4: 7a 89 ldd r23, Y+18 ; 0x12
 7bf6: 85 e2 ldi r24, 0x25 ; 37
 7bf8: 94 e0 ldi r25, 0x04 ; 4
 7bfa: 8c 0f add r24, r28
 7bfc: 9d 1f adc r25, r29
 7bfe: 0e 94 cf 37 call 0x6f9e ; 0x6f9e <HEX_ss_HEXLsLONGINTssSTRING8>
 7c02: 45 e2 ldi r20, 0x25 ; 37
 7c04: 54 e0 ldi r21, 0x04 ; 4
 7c06: 4c 0f add r20, r28
 7c08: 5d 1f adc r21, r29
 7c0a: af ef ldi r26, 0xFF ; 255
 7c0c: 6a 2f mov r22, r26
 7c0e: 71 2d mov r23, r1
 7c10: 85 e2 ldi r24, 0x25 ; 37
 7c12: 93 e0 ldi r25, 0x03 ; 3
 7c14: 8c 0f add r24, r28
 7c16: 9d 1f adc r25, r29
 7c18: 0e 94 89 02 call 0x512 ; 0x512 <fpc_shortstr_to_shortstr>
 7c1c: 25 e2 ldi r18, 0x25 ; 37
 7c1e: 33 e0 ldi r19, 0x03 ; 3
 7c20: 2c 0f add r18, r28
 7c22: 3d 1f adc r19, r29
 7c24: e3 e2 ldi r30, 0x23 ; 35
 7c26: f1 e0 ldi r31, 0x01 ; 1
 7c28: ec 0f add r30, r28
 7c2a: fd 1f adc r31, r29
 7c2c: 21 93 st Z+, r18
 7c2e: 30 83 st Z, r19
 7c30: 49 e1 ldi r20, 0x19 ; 25
 7c32: 51 e0 ldi r21, 0x01 ; 1
 7c34: 4c 0f add r20, r28
 7c36: 5d 1f adc r21, r29
 7c38: a5 e0 ldi r26, 0x05 ; 5
 7c3a: 2a 2f mov r18, r26
 7c3c: 31 2d mov r19, r1
 7c3e: af ef ldi r26, 0xFF ; 255
 7c40: 6a 2f mov r22, r26
 7c42: 71 2d mov r23, r1
 7c44: 89 e1 ldi r24, 0x19 ; 25
 7c46: 90 e0 ldi r25, 0x00 ; 0
 7c48: 8c 0f add r24, r28
 7c4a: 9d 1f adc r25, r29
 7c4c: 0e 94 9c 03 call 0x738 ; 0x738 <fpc_shortstr_concat_multi>
 7c50: 89 e1 ldi r24, 0x19 ; 25
 7c52: 90 e0 ldi r25, 0x00 ; 0
 7c54: 8c 0f add r24, r28
 7c56: 9d 1f adc r25, r29
 7c58: 0e 94 1f 14 call 0x283e ; 0x283e <UFP_UARTSERIAL_ss_WRITELNsSHORTSTRING>
 writeln('After target : '+ MACToStr(TargetHA)+ ' ('+ inet_ntoa(TargetPA)+ ') '+ hexl(TargetPA));
 7c5c: 34 e4 ldi r19, 0x44 ; 68
 7c5e: 24 e0 ldi r18, 0x04 ; 4
 7c60: e9 e1 ldi r30, 0x19 ; 25
 7c62: f1 e0 ldi r31, 0x01 ; 1
 7c64: ec 0f add r30, r28
 7c66: fd 1f adc r31, r29
 7c68: 31 93 st Z+, r19
 7c6a: 20 83 st Z, r18
 7c6c: 6b 89 ldd r22, Y+19 ; 0x13
 7c6e: 7c 89 ldd r23, Y+20 ; 0x14
 7c70: 85 e2 ldi r24, 0x25 ; 37
 7c72: 91 e0 ldi r25, 0x01 ; 1
 7c74: 8c 0f add r24, r28
 7c76: 9d 1f adc r25, r29
 7c78: 0e 94 a7 14 call 0x294e ; 0x294e <NETWORK_ss_MACTOSTRsTMACADDRESSssSHORTSTRING>
 7c7c: 25 e2 ldi r18, 0x25 ; 37
 7c7e: 31 e0 ldi r19, 0x01 ; 1
 7c80: 2c 0f add r18, r28
 7c82: 3d 1f adc r19, r29
 7c84: eb e1 ldi r30, 0x1B ; 27
 7c86: f1 e0 ldi r31, 0x01 ; 1
 7c88: ec 0f add r30, r28
 7c8a: fd 1f adc r31, r29
 7c8c: 21 93 st Z+, r18
 7c8e: 30 83 st Z, r19
 7c90: 2c e3 ldi r18, 0x3C ; 60
 7c92: 34 e0 ldi r19, 0x04 ; 4
 7c94: ed e1 ldi r30, 0x1D ; 29
 7c96: f1 e0 ldi r31, 0x01 ; 1
 7c98: ec 0f add r30, r28
 7c9a: fd 1f adc r31, r29
 7c9c: 21 93 st Z+, r18
 7c9e: 30 83 st Z, r19
 7ca0: 4d 89 ldd r20, Y+21 ; 0x15
 7ca2: 5e 89 ldd r21, Y+22 ; 0x16
 7ca4: 6f 89 ldd r22, Y+23 ; 0x17
 7ca6: 78 8d ldd r23, Y+24 ; 0x18
 7ca8: 85 e2 ldi r24, 0x25 ; 37
 7caa: 92 e0 ldi r25, 0x02 ; 2
 7cac: 8c 0f add r24, r28
 7cae: 9d 1f adc r25, r29
 7cb0: 0e 94 46 33 call 0x668c ; 0x668c <SOCKETS_ss_INET_NTOAsLONGWORDssSHORTSTRING>
 7cb4: 25 e2 ldi r18, 0x25 ; 37
 7cb6: 32 e0 ldi r19, 0x02 ; 2
 7cb8: 2c 0f add r18, r28
 7cba: 3d 1f adc r19, r29
 7cbc: ef e1 ldi r30, 0x1F ; 31
 7cbe: f1 e0 ldi r31, 0x01 ; 1
 7cc0: ec 0f add r30, r28
 7cc2: fd 1f adc r31, r29
 7cc4: 21 93 st Z+, r18
 7cc6: 30 83 st Z, r19
 7cc8: 20 e4 ldi r18, 0x40 ; 64
 7cca: 34 e0 ldi r19, 0x04 ; 4
 7ccc: e1 e2 ldi r30, 0x21 ; 33
 7cce: f1 e0 ldi r31, 0x01 ; 1
 7cd0: ec 0f add r30, r28
 7cd2: fd 1f adc r31, r29
 7cd4: 21 93 st Z+, r18
 7cd6: 30 83 st Z, r19
 7cd8: 4d 89 ldd r20, Y+21 ; 0x15
 7cda: 5e 89 ldd r21, Y+22 ; 0x16
 7cdc: 6f 89 ldd r22, Y+23 ; 0x17
 7cde: 78 8d ldd r23, Y+24 ; 0x18
 7ce0: 85 e2 ldi r24, 0x25 ; 37
 7ce2: 94 e0 ldi r25, 0x04 ; 4
 7ce4: 8c 0f add r24, r28
 7ce6: 9d 1f adc r25, r29
 7ce8: 0e 94 cf 37 call 0x6f9e ; 0x6f9e <HEX_ss_HEXLsLONGINTssSTRING8>
 7cec: 45 e2 ldi r20, 0x25 ; 37
 7cee: 54 e0 ldi r21, 0x04 ; 4
 7cf0: 4c 0f add r20, r28
 7cf2: 5d 1f adc r21, r29
 7cf4: af ef ldi r26, 0xFF ; 255
 7cf6: 6a 2f mov r22, r26
 7cf8: 71 2d mov r23, r1
 7cfa: 85 e2 ldi r24, 0x25 ; 37
 7cfc: 93 e0 ldi r25, 0x03 ; 3
 7cfe: 8c 0f add r24, r28
 7d00: 9d 1f adc r25, r29
 7d02: 0e 94 89 02 call 0x512 ; 0x512 <fpc_shortstr_to_shortstr>
 7d06: 25 e2 ldi r18, 0x25 ; 37
 7d08: 33 e0 ldi r19, 0x03 ; 3
 7d0a: 2c 0f add r18, r28
 7d0c: 3d 1f adc r19, r29
 7d0e: e3 e2 ldi r30, 0x23 ; 35
 7d10: f1 e0 ldi r31, 0x01 ; 1
 7d12: ec 0f add r30, r28
 7d14: fd 1f adc r31, r29
 7d16: 21 93 st Z+, r18
 7d18: 30 83 st Z, r19
 7d1a: 49 e1 ldi r20, 0x19 ; 25
 7d1c: 51 e0 ldi r21, 0x01 ; 1
 7d1e: 4c 0f add r20, r28
 7d20: 5d 1f adc r21, r29
 7d22: a5 e0 ldi r26, 0x05 ; 5
 7d24: 2a 2f mov r18, r26
 7d26: 31 2d mov r19, r1
 7d28: af ef ldi r26, 0xFF ; 255
 7d2a: 6a 2f mov r22, r26
 7d2c: 71 2d mov r23, r1
 7d2e: 89 e1 ldi r24, 0x19 ; 25
 7d30: 90 e0 ldi r25, 0x00 ; 0
 7d32: 8c 0f add r24, r28
 7d34: 9d 1f adc r25, r29
 7d36: 0e 94 9c 03 call 0x738 ; 0x738 <fpc_shortstr_concat_multi>
 7d3a: 89 e1 ldi r24, 0x19 ; 25
 7d3c: 90 e0 ldi r25, 0x00 ; 0
 7d3e: 8c 0f add r24, r28
 7d40: 9d 1f adc r25, r29
 7d42: 0e 94 1f 14 call 0x283e ; 0x283e <UFP_UARTSERIAL_ss_WRITELNsSHORTSTRING>
 ...
Сборка производилась Free Pascal 3.2.0
Я плохо знаю ассемблер AVR и прошу знатоков подсказать, что тут не так и чего с этим можно сделать.
P.S. Очень удивил в эльфе вызов процедуры "ARP_ss_PROCESSARPscrcEB739556" везде есть типизация переданных параметров а тут их нет.





 Согласен. Но Borland pascal 7.0 сожрал и так. Как Карл? Только что проверил.
  Согласен. Но Borland pascal 7.0 сожрал и так. Как Карл? Только что проверил.