2008-11-27 20 views
6

Làm cách nào để truy cập người dùng R13 và R14 được lưu khi chế độ giám sát được nhập? Tôi đang sử dụng ARM7TDMI.ARM. Truy cập người dùng R13 và R14 từ chế độ Giám sát

I.E. Tôi không muốn truy cập người giám sát R14 mà bây giờ chứa địa chỉ trả về cho chế độ người dùng, thay vào đó muốn giá trị của thanh ghi liên kết của chế độ người dùng. Đây là một phần của trình gỡ rối tôi đang viết.

Có bí danh đặc biệt nào cho những thanh ghi này không?

Cảm ơn

Trả lời

9

Tôi sẽ mô tả câu trả lời cho câu hỏi cụ thể của bạn nhưng cách tiếp cận tương tự cũng áp dụng cho các chế độ khác.

Bạn cần thay đổi chế độ bộ xử lý bằng cách thay đổi các bit chế độ trong CPSR sang chế độ hệ thống. Điều này sẽ cho phép bạn truy cập vào SP/LR của chế độ người dùng (R13 & R14). Hãy nhớ rằng chế độ hệ thống là đặc quyền, nhưng R13 và R14 của nó giống với chế độ R13 và R14 của chế độ người dùng.

Khi bạn đang ở chế độ hệ thống, hãy đọc R13 và R14 và đặt chúng ở nơi bạn muốn. Sau đó, chỉ cần chuyển các bit chế độ về chế độ trước đó của bạn (tôi tin rằng đó là chế độ giám sát trong ví dụ của bạn) và bạn tốt để đi.

Lưu ý rằng chúng tôi đã không chuyển từ người giám sát sang chế độ người dùng. Nếu bạn chuyển từ người giám sát sang người dùng, bạn không thể quay lại chế độ giám sát. (Nếu không sẽ không có sự bảo vệ từ đặc quyền leo thang mã người dùng). Đó là lý do tại sao chúng tôi sử dụng chế độ hệ thống - chế độ hệ thống được đặc quyền, nhưng thanh ghi cũng giống như chế độ người dùng.

Bạn có thể chuyển đổi giữa bất kỳ chế độ đặc quyền nào theo ý muốn bằng cách thao tác các bit chế độ trong CPSR. Tôi nghĩ rằng họ là 5 bit thấp hơn? Tôi đang ở trên đường & không có thông tin trong tầm tay của tôi. Nếu không, tôi sẽ cung cấp cho bạn mã lắp ráp cho những gì tôi đã mô tả ở trên. Trên thực tế, nếu bạn muốn đặt một số lông trên ngực của bạn, lấy những gì tôi đã cho bạn ở trên, thực hiện nó, kiểm tra nó, và gửi nó trở lại đây. :-D

(Một điều tôi nên thêm cho "trường hợp chung" (bạn rất cụ thể) - bạn có thể kiểm tra SPSR để xem "bạn đến từ đâu" - và sử dụng để xác định chế độ nào cần phải chuyển sang.)

Nhân tiện, tôi vừa mới làm điều này gần đây cho một trong những khách hàng của tôi .... thế giới nhỏ bé, tôi đoán vậy.

+0

Wow cảm ơn. Tôi không bao giờ nhận thấy rằng chế độ người dùng và chế độ hệ thống được chia sẻ cùng một thanh ghi! Tôi sẽ bị nứt mã. Tôi sợ tôi không thể đăng nó ở đây bởi vì nó là cho một mảnh của courswork - nhưng tôi nghĩ rằng bạn đã mô tả các nguyên tắc rất tốt, đó là quan trọng hơn. – Tarski

+0

Bạn được chào đón. Chúc may mắn với các môn học. – Dan

+0

Hi Dan, Nếu ARM đang ở chế độ hyp và phải đọc R13/r14 của PL1 NS = 1 chế độ (SVC) làm thế nào nó sẽ được thực hiện? – mSO

3

Tôi đã phát hiện ra một cách tốt hơn: -

Khi làm một STM, nếu R15 không phải là một trong những toán hạng rồi^cho phép truy cập vào thanh ghi sử dụng chế độ. Tuy nhiên, tính năng tự động phát hiện dường như không hoạt động trong hướng dẫn, và sau đó cần phải có nop nếu bạn muốn truy cập vào ngân hàng đăng ký.

Something như

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode 
nop 
sub r13, r13, #8  ;update stack pointer 
+0

^chỉ có trong ARMv6 và mới hơn, IIRC. –

+0

Đây là một tìm kiếm tuyệt vời! Theo http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Cihcadda.html, sử dụng này là "không được chấp nhận", mặc dù. Không thực sự chắc chắn liệu có nên quan tâm đến điều đó không. – Brendan

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