B"10_0100_00", -- 000 LI 4 B"11_1000_00", -- 001 CALL B"10_1101_00", -- 002 LI -3 B"11_1111_00", -- 003 J B"10_0111_00", -- 004 LI 7 B"11_1000_00", -- 005 CALL B"11_1001_00", -- 006 RET B"10_1010_00", -- 007 LI A B"11_1000_00", -- 008 CALL B"11_1001_00", -- 009 RET B"10_1101_00", -- 00A LI D B"11_1000_00", -- 00B CALL B"11_1001_00", -- 00C RET B"00_0000_00", -- 00D dummy B"11_1001_00" -- 00E RET
То есть, можно вызывать функции и даже корректно работает возврат!
Стек аппаратный, глубиной всего 4: то есть, можно вызвать функцию из функции из функции из корневого кода.
С одной стороны, это как-то совсем немного.... с другой стороны, если вдруг нужно будет больше, то достаточно будет изменить константу в VHDL-коде стека. А знаменитый AT90S1200 вполне успешно работал со стеком глубиной 3.
В примере выше - "короткие" вызовы, где достаточно указать только младшие 4 бита из 12-разрядного адреса. Если нужен "длинный" переход, то надо записать полный (или полу-полный) адрес в соответствующий спецрегистр. Инструкций при этом становится, само собой, побольше.