Стереть бы два моих предыдущих поста, что-то "затормозил" я совсем. Евгений же идентификаторами переменных на их тип указывал.
Код:
(* ==================================================================
MODULE HelloWorld;
VAR
n :INTEGER;
s :SET;
b :BOOLEAN;
BEGIN
n := 33;
s := {1};
b := n IN s;
END HelloWorld.
================================================================== *)
Oberon -> ARMv7-M Compiler 13.4.2017
HelloWorld 20 12 DFDC2123
OARMv7MLinker 11.1.2017
linking HelloWorld Ok
HelloWorld 256
ROM: 584 B; RAM: 20 B
O7ARMv7MTool 19.9.2014
decode HelloWorld.hex
00400000H:
0 00003FEC SUBS r7, #236
1 00002000 MOVS r0, #0
2 00000229 LSLS r1, r5, #8
3 00000040 LSLS r0, r0, #1
256 0000BF00 NOP
257 0000B500 PUSH {LR}
258 00002021 MOVS r0, #33
259 0000F8D6 ...
260 00003000 LDR.W r3, [r6]
261 00006018 STR r0, [r3] (* n := 33 -- 4 команды *)
262 00002002 MOVS r0, #2
263 00006058 STR r0, [r3, #1] ; 4 (* s := {1} -- 2 команды *)
264 00006858 LDR r0, [r3, #1] ; 4 (* R0 <- s *)
265 00006819 LDR r1, [r3] (* R1 <- n *)
266 00001C49 ADDS r1, r1, #1 (* R1 <- 34 *)
267 000041C8 RORS r0, r1 (* 34 сдвига вправо числа 2 --> 80000000H и выставлены флаги рез-та команды N = 1 *)
268 0000D501 BPL 1 ; 2 (* ветвление если рез-тат положительный, те флаг N = 0 *)
269 00002001 MOVS r0, #1 (* тк флаг N = 1, то R0 <- 1 *)
270 0000E000 B 0 ; 1
271 00002000 MOVS r0, #0
272 0000F8D6 ...
273 00003000 LDR.W r3, [r6]
274 00007218 STRB r0, [r3, #8] (* результат сохранён в ОЗУ *)
275 0000BD00 POP {PC} (* That's all folks *)
276 0000F643 ...
277 000076FC MOVW r6, #16380 ; 0x3FFC
278 0000F2C2 ...
279 00000600 MOVT r6, #8192 ; 0x2000
280 00001F30 SUBS r0, r6, #4
281 00002100 MOVS r1, #0
282 00006001 STR r1, [r0]
283 0000F643 ...
284 000070EC MOVW r0, #16364 ; 0x3FEC
285 0000F2C2 ...
286 00000000 MOVT r0, #8192 ; 0x2000
287 00006030 STR r0, [r6]
288 0000F7FF ...
289 0000FFDF BL -66 ; -33
290 0000E7FE B -2 ; -1
291 0000BF00 NOP
start linear address: 00400001H
Проц в данный момент недоступен, посему не обессудьте: "пешим по-конному".
Вот как-то так…