2013-08-12 30 views
9

Tôi đã tự hỏi whats sự khác biệt giữa stack trong C và ngăn xếp trong assembler cho các bộ vi xử lý như RISC hoặc ARM?Stack trong lắp ráp vs stack trong c?

Proffesor nói, hãy cẩn thận, ngăn xếp khác với chồng bạn đã biết về về đề tài khác (Algorithms và Kiến trúc, nơi chúng tôi tìm hiểu về C)

Theo như tôi có thể nhớ lại, cả hai đều chỉ lưu dữ liệu trong bộ nhớ, cả hai chức năng trên chương trình LastInFirstOut, cả hai cần phải được làm sạch sau khi sử dụng.

Ý tôi là, chúng không thể giống nhau vì chúng ở hai "thế giới" khác nhau nhưng tôi thiếu một điều gì đó quan trọng khác với chúng? Có thể thats nó, nhưng nó đã được bugging tôi từ bao giờ.

Cảm ơn bạn

+2

bạn có nghĩa là C hoặc C# không? – Liam

+7

_ "bộ xử lý như RISC hoặc ARM" _. RISC chỉ là một khái niệm, trong khi ARM là một thiết kế cụ thể của một kiến ​​trúc kiểu RISC. – Michael

+0

Giáo sư có thể có nghĩa là nó khác nhau vì ngăn xếp cuộc gọi/trả lại được quản lý, (một phần), trong phần cứng. –

Trả lời

9

Ngăn xếp hoàn toàn giống nhau. Người ta có thể viết một chương trình hỗn hợp/C và họ sử dụng cùng một ngăn xếp.

Trình biên dịch C sử dụng một số quy ước về cách sử dụng ngăn xếp: khung ngăn xếp được định dạng tốt được điền vào tại mỗi mục nhập chức năng; và làm sạch tại chức năng để lại. Có các chỉ thị trình biên dịch cụ thể để thay đổi việc quản lý ngăn xếp. Ví dụ: gcc stack checking

Một số tài liệu tham khảo trên web: google : c stack frame

Trong hội, ngăn xếp phải được quản lý hoàn toàn bởi các lập trình viên. Đó là một thực hành tốt để có những quy định về cách quản lý chồng (và bắt chước quy tắc C chẳng hạn)

Các stack hướng dẫn quản lý cũng khá bộ xử lý phụ thuộc (hướng dẫn như pushpop trên x86, hoặc stmia/ldmfd trên ARM . thanh ghi Tương tự như vậy, một số bộ vi xử lý đã cống hiến cho con trỏ ngăn xếp (esp trên x86), đối với một số khác, nó chỉ là thông thường (r13 trên ARM7.)

một cách tốt để tìm hiểu về quản lý ngăn xếp là sử dụng một trình gỡ lỗi và làm một số backtracing để xem nội dung khung.

Cho ag ood sự hiểu biết về ngăn xếp x86 ở cấp độ lắp ráp, tôi khuyên bạn nên this Wikipedia articlethis one for stack frames

+1

Tuyệt vời. Điều đó đã giải quyết được vấn đề của tôi! Nhưng bây giờ tôi có thêm một câu hỏi, một điều gì đó khác hẳn. :) Whats với heap c/assembly? –

+4

Bạn nên đặt câu hỏi này như một câu hỏi khác. Heap là một điều cụ thể của libc và không có sự tương đương trong assembly (không có 'malloc' /' free'). Nhưng bạn vẫn có thể gọi libc từ hội đồng và sau đó nhận được quyền truy cập vào heap, mặc dù nó là chuyên gia lập trình. –

2

Tôi đã thấy trình biên dịch sử dụng mô hình overlay thay vì mô hình ngăn xếp cho các biến tự động của chúng. Trong khi ngôn ngữ trình bày việc phân bổ và deallocation của các biến tự động như một ngăn xếp, việc triển khai cơ bản không cần phải như vậy.

Trên một số trình biên dịch, ngăn xếp C tồn tại nhưng tách biệt với ngăn xếp phần cứng.

Sau đó, có các khái niệm như register-windows.

Danh sách tiếp tục, nhưng tôi không thể đảm bảo rằng bất kỳ điều nào trong số này là những gì giáo sư của bạn có trong đầu, hoặc thậm chí tôi đang đi đúng hướng. Chỉ có một người có thể trả lời một cách đáng tin cậy.

Hầu hết các biến thể này đều rộng rãi về mặt khái niệm với ngăn xếp, nhưng chi tiết triển khai là điều bạn cần phải biết nếu bạn đang làm việc với cả hai ngôn ngữ.

1

Một điều khác biệt về ngăn xếp khái niệm so với ngăn xếp x86 (và các kiến ​​trúc có thể khác) là hướng chồng tăng lên.Nó phổ biến để dạy các ngăn xếp như phát triển "lên" khi (tùy thuộc vào kiến ​​trúc) nó thực sự có thể phát triển xuống trong bộ nhớ.