Кортексам специальный код не нужен, а для arm7, у которого
невыровненное обращение к памяти вызывает bus fault, ИАР вставляет
вызов функции __aeabi_uread4, которая читает побайтно, ну или
__aeabi_uwrite4 для записи.
10 struct s5 {
11 char c;
12 int i;
13 };
14
15 __packed struct s5packed {
16 char c;
17 int i;
18 };
19
\ In section .text, align 2, keep-with-next
20 int foo(struct s5 * p)
21 {
22 return p->i;
\ foo: (+1)
\ 0x0 0x6840 LDR R0,[R0, #+4]
\ 0x2 0x4770 BX LR ;; return
23 }
24
\ In section .text, align 2, keep-with-next
25 int foop(struct s5packed * p)
26 {
\ foop: (+1)
\ 0x0 0xB500 PUSH {LR}
27 return p->i;
\ 0x2 0x1C40 ADDS R0,R0,#+1
\ 0x4 0x....'.... BL __aeabi_uread4
\ 0x8 0xBC08 POP {R3}
\ 0xA 0x4718 BX R3 ;; return
28 }
29
\ In section .text, align 2, keep-with-next
30 int bar(int __packed * p)
31 {
\ bar: (+1)
\ 0x0 0xB500 PUSH {LR}
32 return *p;
\ 0x2 0x....'.... BL __aeabi_uread4
\ 0x6 0xBC08 POP {R3}
\ 0x8 0x4718 BX R3 ;; return
33 }
34
\ In section .text, align 2, keep-with-next
35 int bar1(struct s5packed *p)
36 {
\ bar1: (+1)
\ 0x0 0xB580 PUSH {R7,LR}
37 return bar(&p->i);
\ 0x2 0x1C40 ADDS R0,R0,#+1
\ 0x4 0x....'.... BL bar
\ 0x8 0xBC0A POP {R1,R3}
\ 0xA 0x4718 BX R3 ;; return
38 }
-
- Я хотел сказать "код в студию". - SciFi(01.05.2020 08:54)