Но обовсём по порядку.
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" везде есть типизация переданных параметров а тут их нет.