2010-12-31 34 views
8

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.

+2

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. –

+0

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

Trả lời

7

Có nhiều hơn .align chỉ thị chỉ vì cách trình biên dịch hoạt động bên trong; người ta sẽ đủ và phát ra chỉ một người có thêm công việc.

Theo như sự liên kết nói chung, đó là một chủ đề phức tạp nhưng đây là một bài báo cho Intel x64 mà thảo luận về một số vấn đề bạn quan tâm:

kiến ​​trúc khác có thể rất khác nhau.

+0

Tôi nghi ngờ rằng chỉ thị .align thứ hai là do trình biên dịch hoạt động như thế nào, nhưng đó là một điều tốt để biết nó ngay bây giờ. Cảm ơn cũng cho liên kết – jena

Các vấn đề liên quan