2012-03-21 36 views
7

Tôi đang học ngôn ngữ lắp ráp trong thời gian rảnh rỗi để trở thành một nhà phát triển tốt hơn.Ngôn ngữ lắp ráp - Máy xếp

Tôi hiểu sự khác biệt giữa các máy dựa trên nền tảng và máy dựa trên đăng ký ở mức khái niệm, nhưng tôi tự hỏi cách các máy dựa trên stack thực sự được triển khai như thế nào. Nếu máy ảo, ví dụ: JVM hoặc .NET, chạy trên kiến ​​trúc dựa trên đăng ký, ví dụ: x86 hoặc x64, sau đó nó phải sử dụng thanh ghi ở cấp độ lắp ráp (theo như tôi quan tâm). Tôi rõ ràng là thiếu một cái gì đó ở đây. Vì vậy tôi không chắc chắn về sự khác biệt ở ngôn ngữ lắp ráp.

Tôi đã đọc các bài viết ở đây, ví dụ: Stack-based machine depends on a register-based machine? và cũng trên Wikipedia, nhưng tôi không tin họ trả lời trực tiếp câu hỏi của tôi.

+0

Họ * có thể * mô phỏng nó trong phần mềm, JVM cũ hơn đã làm điều đó. Thông thường, mặc dù mã stack-machine được biên dịch thành mã gốc (bất kỳ kiến ​​trúc nào có thể). Mã máy Stack là tốt đẹp bởi vì nó có một mã hóa ngắn gọn, nó dễ dàng để tạo ra từ AST và tương đối dễ dàng để phân tích. – harold

Trả lời

4

sau đó nó phải sử dụng đăng ký ở mức lắp ráp

Đó không phải là yêu cầu, bộ vi xử lý có một ngăn xếp cpu hoạt động rất giống với chồng ảo trong ngôn ngữ trung gian. Bạn có thể dịch các hướng dẫn gần như một-với-một để hướng dẫn cpu. Chắc chắn một trong những lý do mà các máy ảo dựa trên stack là phổ biến, jitter rất dễ thực hiện.

Cách duy nhất để thực hiện theo cách đó là mã máy không hiệu quả lắm. Đây là công việc của trình tối ưu hóa jitter để tìm cách sử dụng thanh ghi cpu hiệu quả và làm cho mã nhanh hơn theo cách đó.

Vấn đề ngược lại hiện diện trong các máy ảo dựa trên đăng ký. Đó là một vấn đề khó giải quyết vì CPU thực không có nhiều thanh ghi như máy ảo. Vì vậy, jitter phải tìm cách sử dụng ngăn xếp để làm tràn các thanh ghi mà phần cứng không cung cấp.

7

Máy dựa trên ngăn xếp hiếm khi được triển khai trong phần cứng - Tôi chỉ nghe nói về một trong những triển khai như vậy và chưa bao giờ có cơ hội làm việc trên một.

Trong thực tế, máy Stack được thực hiện trên bộ xử lý dựa trên đăng ký thực bằng trình thông dịch gốc. Về bản chất, máy Stack lý thuyết được mô phỏng bởi máy dựa trên Đăng ký thực.

Vì vậy, để trả lời câu hỏi của bạn: mặc dù mã máy của máy ngăn xếp không có thanh ghi, trình thông dịch gốc thực thi các hướng dẫn này có đăng ký và sẽ sử dụng chúng.

Q: Vậy tại sao lại là gián tiếp? A: Tính di động - tập lệnh của máy xếp có thể được mô phỏng trên bất kỳ số máy đăng ký nào khác nhau. Điều này có nghĩa rằng các ứng dụng cùng một JVM có thể chạy trên bất kỳ máy tính mà có một thông dịch viên, do đó khẩu hiệu Java cũ "Viết một lần, chạy mọi nơi"

+0

ý bạn là gì bởi "người phiên dịch tự nhiên". Bạn đang đề cập đến trình biên dịch JIT (trong trường hợp của .NET)? – w0051977

+0

Bằng "trình thông dịch gốc", tôi có nghĩa là một ứng dụng chạy trên máy cục bộ của bạn đọc các hướng dẫn của máy Stack đang thực thi chúng. Mỗi loại máy (và hệ điều hành) sẽ có một "trình thông dịch gốc" khác nhau. Trong trường hợp của Java, "trình thông dịch gốc" là JVM. JIT là một cái gì đó hơi khác nhau. – Stormcloud

+0

Chỉ để bạn tham khảo, JIT là thứ gì đó sẽ biến các hướng dẫn của máy xếp chồng thành một bộ hướng dẫn tương đương cho máy tính bản địa (máy đăng ký dựa trên). Đây là một nỗ lực để cung cấp cho ứng dụng một hiệu suất gần với bộ xử lý gốc, nhưng đồng thời giữ các ưu điểm cho tính di động. – Stormcloud

6

Để tham khảo, Burroughs B5000Inmos Transputer là các máy xếp chồng. DEC PDP11 có các chế độ địa chỉ linh hoạt như vậy mà nó có thể được sử dụng như một máy xếp chồng. Tôi nghĩ rằng Niklaus Wirth's Lilith có thể đã là một máy xếp chồng (hơn 20 năm trước đây, tâm trí của tôi bị trượt :-)

Họ thực sự không có bất kỳ tên/số đăng ký nào trong hướng dẫn để tìm toán hạng, vì chúng ở trên ngăn xếp.

Hướng dẫn có thể tải các giá trị ngay (liên tục) vào ngăn xếp hoặc tải/lưu trữ vào bộ nhớ.

Vì vậy, họ không phải là add.w r0, r1, r5 hoặc add.w eax, [#fe34]. Có add.w.

Vì vậy, một ví dụ (không phải ở tất cả các chính xác, đó là phức tạp hơn) của một chuỗi lắp ráp có thể

loadstack 0xfe34 -- got fe34 onto stack 
loadstackindirect -- use address on the stack, to load the value at that address 
add.w    -- assumes we already have the other operand on the stack 
        -- result back onto the stack 

Để tính toán và nạp một giá trị trong một mảng, ngăn xếp có thể được sử dụng vì có thể có không có chế độ địa chỉ được lập chỉ mục.

Vì vậy, hướng dẫn nhỏ và rất nhiều công việc được thực hiện hoàn toàn với ngăn xếp và ngăn xếp ngăn xếp. IIRC Transputers thực sự có một chồng chỉ có ba giá trị, và trình biên dịch (hoặc các nhà phát triển) phải đảm bảo rằng nó được duy trì.

XMOS hiện bán một 'tương đương' hiện đại và thuê một số người giống nhau.

Đã hơn 20 năm kể từ khi tôi viết mã Transputer, vì vậy xin lỗi vì đã hơi mơ hồ.

Hệ thống UCSD Pascal sử dụng máy ảo được xác định phần mềm, là máy xếp chồng. Ý tưởng là tạo ra thứ gì đó có thể di chuyển sang máy tính mới, nhưng cũng dễ viết, dễ biên dịch và hiệu suất hợp lý. Máy ảo được định nghĩa bằng phương ngữ Pascal của riêng nó. Khi nó được chuyển đến máy tính thực, thanh ghi sẽ được sử dụng để giữ con trỏ ngăn xếp, và có khả năng một số sự khéo léo trong cách trên cùng của ngăn xếp được xử lý (bằng cách đăng ký), để có được hiệu suất hợp lý.

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