Tôi đã xem qua mã tương tự như hiện nay sau và tôi tò mò như những gì đang thực sự xảy ra:Sự so sánh giữa các vùng thực thi và các phần đầu vào là gì?
#pragma pack(1)
__align(2) static unsigned char multi_array[7][24] = { 0 };
__align(2) static unsigned char another_multi_array[7][24] = { 0 };
#pragma pack()
Khi tìm kiếm một tài liệu tham khảo đến từ khóa __align trong trình biên dịch Keil, tôi tình cờ gặp này:
Điều chỉnh các khu vực thực thi và phần nhập Có trường hợp khi bạn muốn ghi đè mã và phần dữ liệu ... Nếu bạn có quyền truy cập vào mã nguồn ban đầu, bạn có thể thực hiện việc này tại thời gian biên dịch với __align (n) từ khóa ...
Tôi không hiểu ý nghĩa của "mã ghi đè và phần dữ liệu". Ai đó có thể giúp làm rõ cách thức điều chỉnh này xảy ra?
Quá mức có thể hữu ích trên ARM. Lệnh "tải ngay lập tức" (MOV) không thể tải toàn bộ giá trị 32 bit. Thay vào đó, nó có thể tải 8 bit tại một thời điểm, được xoay sang bất kỳ vị trí nào. Vì lý do này, mã của bạn có thể đang cố gắng làm cho địa chỉ kết thúc bằng nhiều bit hơn, làm cho mã được biên dịch dễ dàng/nhanh hơn để tải giá trị con trỏ tới nó. –