Example 1:If the formal parameter is an array of bytes with a fixed size it can accept actual parameters of any type, except POINTER, whose size is the same number of bytes [...]
Code: Select all
TYPE Word = ARRAY 4 OF BYTE;
PROCEDURE p0(value: Word);
VAR x: BYTE;
BEGIN
x := value[0]
END p0;
PROCEDURE p1;
VAR i: INTEGER;
BEGIN
p0(i)
END p1;
Example 2:The converse situation is also catered for i.e. a procedure with a formal parameter of any type, except POINTER, can accept an actual parameter which is an array of bytes of the same size.
Code: Select all
TYPE Word = ARRAY 4 OF BYTE;
PROCEDURE p2(value: INTEGER);
VAR x: INTEGER;
BEGIN
x := value
END p2;
PROCEDURE p3;
VAR w: Word;
BEGIN
p2(w)
END p3;
Code: Select all
PROCEDURE p0(value: Word);
VAR x: BYTE;
BEGIN
. 4 04H 0B501H push { r0, lr }
. 6 06H 0B081H sub sp,#4
x := value[0]
END p0;
. 8 08H 09801H ldr r0,[sp,#4]
. 10 0AH 07800H ldrb r0,[r0]
. 12 0CH 0A900H add r1,sp,#0
. 14 0EH 07008H strb r0,[r1]
. 16 010H 0B002H add sp,#8
. 18 012H 0BD00H pop { pc }
PROCEDURE p1;
VAR i: INTEGER;
BEGIN
. 20 014H 0B500H push { lr }
. 22 016H 0B081H sub sp,#4
p0(i)
. 24 018H 04668H mov r0,sp
END p1;
. 26 01AH 0F7FFFFF3H bl.w -26 -> 4
. 30 01EH 0E000H b 0 -> 34
. 32 <LineNo: 14>
. 34 022H 0B001H add sp,#4
. 36 024H 0BD00H pop { pc }
. 38 026H 046C0H nop
Now example 2:
Code: Select all
PROCEDURE p2(value: INTEGER);
VAR x: INTEGER;
BEGIN
. 40 028H 0B501H push { r0, lr }
. 42 02AH 0B081H sub sp,#4
x := value
END p2;
. 44 02CH 09801H ldr r0,[sp,#4]
. 46 02EH 09000H str r0,[sp]
. 48 030H 0B002H add sp,#8
. 50 032H 0BD00H pop { pc }
PROCEDURE p3;
VAR w: Word;
BEGIN
. 52 034H 0B500H push { lr }
. 54 036H 0B081H sub sp,#4
p2(w)
. 56 038H 04668H mov r0,sp
END p3;
. 58 03AH 0F7FFFFF5H bl.w -22 -> 40
. 62 03EH 0E000H b 0 -> 66
. 64 <LineNo: 26>
. 66 042H 0B001H add sp,#4
. 68 044H 0BD00H pop { pc }
. 70 046H 046C0H nop
Either 1) I misunderstand the Guide, or 2) the situation of example 2 does not work for basic types (Astrobe for Cortex-M0 v9.1).
If I do understand the Guide correctly, the assembly code for 'p3' should read in this case with an INTEGER as "target" value parameter:
Code: Select all
PROCEDURE p3;
VAR w: Word;
BEGIN
. 52 034H 0B500H push { lr }
. 54 036H 0B081H sub sp,#4
p2(w)
. 56 038H 04668H mov r0,[sp] (* <== here *)
END p3;
. 58 03AH 0F7FFFFF5H bl.w -22 -> 40
. 62 03EH 0E000H b 0 -> 66
. 64 <LineNo: 26>
. 66 042H 0B001H add sp,#4
. 68 044H 0BD00H pop { pc }
. 70 046H 046C0H nop
Code: Select all
PROCEDURE p2(VAR value: INTEGER);
VAR x: INTEGER;
BEGIN
x := value
END p2;
PROCEDURE p3;
VAR w: Word;
BEGIN
p2(w)
END p3;
Code: Select all
PROCEDURE p2(VAR value: INTEGER);
VAR x: INTEGER;
BEGIN
. 40 028H 0B501H push { r0, lr }
. 42 02AH 0B081H sub sp,#4
x := value
END p2;
. 44 02CH 09801H ldr r0,[sp,#4]
. 46 02EH 06800H ldr r0,[r0]
. 48 030H 09000H str r0,[sp]
. 50 032H 0B002H add sp,#8
. 52 034H 0BD00H pop { pc }
. 54 036H 046C0H nop
PROCEDURE p3;
VAR w: Word;
BEGIN
. 56 038H 0B500H push { lr }
. 58 03AH 0B081H sub sp,#4
p2(w)
. 60 03CH 04668H mov r0,sp
END p3;
. 62 03EH 0F7FFFFF3H bl.w -26 -> 40
. 66 042H 0E000H b 0 -> 70
. 68 <LineNo: 26>
. 70 046H 0B001H add sp,#4
. 72 048H 0BD00H pop { pc }
. 74 04AH 046C0H nop