Tôi đang cố gắng học ngôn ngữ lắp ráp và tôi cần làm rõ về điều gì đó. Xin vui lòng sửa tôi nếu tôi sai về bất kỳ điều này kể từ khi tôi không biết nhiều về lắp ráp.Phân bổ bộ nhớ lắp ráp
Tất cả các hướng dẫn tôi xem đều có các biến của chương trình lắp ráp được gán cho địa chỉ bộ nhớ như 0x0000
và tôi có thể hiểu rằng bạn phải chỉ định địa chỉ bộ nhớ theo cách thủ công trong assembly, nhưng làm cách nào để biết địa chỉ nào cần sử dụng?
Rõ ràng việc bắt đầu ở địa chỉ bộ nhớ thấp nhất có thể có ý nghĩa, nhưng nếu biến bạn đang gán lớn hơn bộ nhớ có sẵn tại 0x0000
thì sao? Biến số được đề cập có chạy qua 0x0001
hoặc 0x0002
không? Nếu nó đã không sẽ làm lộn xộn lên các biến khác được gán không gian với số tương tự (hoặc là bạn không phải gán cho họ mà đóng)?
Nếu tôi có hai chương trình được viết trong assembly chạy cùng một lúc (trong hệ điều hành hiện đại) và tôi đã sử dụng cùng một địa chỉ bộ nhớ trong cả hai chương trình, sẽ có một chương trình xung đột với chương trình khác. có sẵn địa chỉ bộ nhớ bất kể những gì đã thực sự được viết trong chương trình?
Bất kỳ thông tin nào về chủ đề đều được đánh giá cao.
Cảm ơn câu trả lời chi tiết! Trong phần cuối của câu trả lời của bạn, làm thế nào để tính toán chính xác bao nhiêu không gian là cần thiết cho mỗi bit dữ liệu? tự tính toán hàng trăm biến cho một chương trình có vẻ không khả thi. Sử dụng từ ngữ của bạn, làm thế nào để bạn 'lay nó ra'? – ubiquibacon
Tôi chưa bao giờ làm việc với assembly trong bất kỳ dự án lớn nào, nhưng heuristic đã được đề xuất trong lớp OS của tôi là sắp xếp các biến theo kích thước và sau đó đặt các biến nhỏ nhất ở các địa chỉ bộ nhớ thấp nhất. Đây không phải lúc nào cũng là bố cục tốt nhất - bạn có thể phù hợp với các loại dữ liệu nhỏ giữa các loại dữ liệu lớn. Bạn có thể biết được loại biến của bộ nhớ cần bao nhiêu bộ nhớ - hãy tham khảo tài liệu cho ngôn ngữ lắp ráp của bạn. Hãy nhớ rằng, một biến chiếm cùng một lượng bộ nhớ thông qua toàn bộ quá trình chạy chương trình của bạn. Nó không thể "phát triển" được. Đó là lý do tại sao sự tràn ngập xảy ra. –
Câu trả lời hay, chỉ một lần sửa. Việc căn chỉnh dữ liệu đúng cách không phải là về tiết kiệm dung lượng, vì tất cả các bộ nhớ liền kề của nó đều là. Nó đã làm với cách dữ liệu xe buýt ánh xạ vào bộ nhớ. 8 bit đầu tiên bắt đầu tại địa chỉ 0, 8 bit tiếp theo kết nối đến địa chỉ 1. Điều này có nghĩa là một số nguyên 16 bit bắt đầu tại địa chỉ 0 có thể được đọc trong một lần đọc bởi vì nó sử dụng cả hai mặt của bus dữ liệu. Tuy nhiên, nếu một số nguyên 16 bit bắt đầu từ 1, bây giờ nó phải thực hiện hai lần đọc để có được toàn bộ số nguyên. Đối với các số nguyên 32 bit, chúng nên bắt đầu trên các địa chỉ chia hết cho 4 vì cùng một lý do. – Despertar