AVR (họ vi điều khiển thường được sử dụng trên bo mạch Arduino) là một Kiến trúc Harvard , có nghĩa là mã và các biến thực thi nằm trong hai bộ nhớ riêng biệt - trong trường hợp này là flash và SRAM. Mã thực thi không bao giờ để lại bộ nhớ flash.
Khi bạn gọi một chức năng, địa chỉ trả về thường được đẩy đến ngăn xếp - ngoại lệ là khi cuộc gọi chức năng xảy ra ở cuối chức năng gọi. Trong trường hợp này, địa chỉ trả về của hàm được gọi là hàm gọi sẽ được sử dụng thay thế - nó đã có trên ngăn xếp.
Việc có bất kỳ dữ liệu nào khác được đưa vào ngăn xếp hay không phụ thuộc vào áp suất thanh ghi trong chức năng gọi và trong chức năng được gọi. Các thanh ghi là vùng làm việc của CPU, AVR có 32 thanh ghi 1 byte. Các thanh ghi có thể được truy cập trực tiếp bằng các hướng dẫn CPU, trong khi dữ liệu trong SRAM trước tiên sẽ phải được lưu trữ trong các thanh ghi. Chỉ khi các đối số hoặc biến cục bộ quá lớn hoặc quá nhiều để phù hợp với các thanh ghi thì chúng mới được đưa vào ngăn xếp. Tuy nhiên, cấu trúc luôn được lưu trữ trên ngăn xếp.
Bạn có thể đọc chi tiết về cách ngăn xếp được trình biên dịch GCC sử dụng trên nền tảng AVR tại đây: https://gcc.gnu.org/wiki/avr-gcc#Frame_Layout
Đọc các phần "Bố cục khung" và "Quy ước gọi" .