Tôi đang dành thời gian cho lập trình lắp ráp (Gas, đặc biệt) và gần đây tôi đã tìm hiểu về chỉ thị sắp xếp. Tôi nghĩ rằng tôi đã hiểu rất cơ bản, nhưng tôi muốn có được một sự hiểu biết sâu sắc hơn về bản chất của nó và khi nào sử dụng sự liên kết.Khi nào các chỉ thị căn chỉnh rõ ràng nên được sử dụng trong lắp ráp?
Ví dụ, tôi tự hỏi về mã lắp ráp của một câu lệnh chuyển đổi C++ đơn giản. Tôi biết rằng trong những trường hợp nhất định chuyển đổi báo cáo này được dựa trên bảng nhảy, như trong một vài dòng mã sau đây:
.section .rodata
.align 4
.align 4
.L8:
.long .L2
.long .L3
.long .L4
.long .L5
...
.align 4 gắn dữ liệu sau trên ranh giới 4-byte tiếp theo nhằm đảm bảo rằng lấy những ký ức vị trí là hiệu quả, phải không? Tôi nghĩ rằng điều này được thực hiện bởi vì có thể có những điều xảy ra trước khi tuyên bố chuyển đổi gây ra sự lệch hướng. Nhưng tại sao lại có hai cuộc gọi đến .align? Có bất kỳ quy tắc nào của ngón tay cái khi gọi .align hay nó chỉ đơn giản được thực hiện bất cứ khi nào một khối dữ liệu mới được lưu trữ trong bộ nhớ và một cái gì đó trước khi điều này có thể đã gây ra sự lệch hướng?
Trong trường hợp mảng, có vẻ như căn chỉnh được thực hiện trên ranh giới 32 byte ngay sau khi mảng chiếm ít nhất 32 byte. Có hiệu quả hơn để làm điều đó theo cách này hoặc là có một lý do khác cho ranh giới 32-byte?
Tôi đánh giá cao bất kỳ lời giải thích hoặc gợi ý nào về văn học.
Chủ của tôi về ngôn ngữ lắp ráp được giới hạn ở 6510, không có hướng dẫn căn chỉnh. Nhưng dựa trên kiến thức về sự liên kết bộ nhớ trong các thiết lập C++, tôi đoán rằng lệnh "căn chỉnh" không phải là một lệnh CPU thực tế. Nó có thể chỉ là một chỉ thị lắp ráp, chỉ ra nơi để chèn các opcodes tiếp theo. Nếu có, hai chỉ thị căn chỉnh trong một hàng giống như chỉ gặp một. –
Tôi nghĩ rằng '.align 2' căn chỉnh mã thành 2^2 = 4 byte. Trong trường hợp của bạn, nơi bạn có '.align 4' allignment là trên 2^4 = 16 byte tôi nghĩ. – 71GA