2012-09-19 96 views
7

Tôi đang làm việc với hội đồng ARM, nơi tôi phải viết một chương trình con mà tôi đang theo quy ước gọi ARM (điều này sẽ phải được tích hợp với khác) để truyền các tham số và giá trị trả lại. Bây giờ ở đây là một cái gì đó tôi không chắc chắn nói chung khi làm việc với lắp ráp.Truyền tham số và giá trị trả về cho một chương trình con trong assembly

Vì vậy, từ quy ước nếu tôi hiểu rõ các đối số được truyền theo thứ tự bắt đầu từ thanh ghi r0 - r4 và sau đó cho các ngăn đối số khác được sử dụng. Giá trị trả về được chuyển tới r0.

Bây giờ, đây là những gì tôi đang bối rối. Nếu tôi phải tiết kiệm bối cảnh của r0 và bật nó ra sau đó thì không có cách nào để trả lại kết quả, cách duy nhất nó có thể được thực hiện là bằng cách làm hỏng đối số đầu tiên. Có cách giải quyết nào đó không? Cảm ơn bạn trước!

Trả lời

6

Khi bạn trả lại giá trị trả về bằng r0, người gọi mong đợi mà bạn sẽ thực hiện việc này. Người gọi không mong đợi rằng r0 sẽ vẫn chứa cùng một giá trị như tham số đầu tiên ban đầu, bởi vì r0 là giá trị trả về.

Thông thường ARM calling convention requires that the subroutine preserves r4 through r11, không r0 đến r3. Vì vậy, không có mâu thuẫn nào.

+0

Vì vậy, tôi đoán đó là trách nhiệm của người gọi để lưu ngữ cảnh của r0 trước khi nó gọi hàm. – as3rdaccount

+0

Từ liên kết bạn đã đăng: * "r0 đến r3: được sử dụng để giữ các giá trị đối số được chuyển đến một chương trình con và cũng giữ kết quả được trả về từ chương trình con" *. – m0skit0

6

Tại sao không chỉ thử bản thân này và xem trình biên dịch làm gì?

unsigned int fun (unsigned int a, unsigned int b) 
{ 
    return(a+b); 
} 

biên dịch phản đối và tháo rời

arm-none-eabi-gcc -O2 -c fun.c -o fun.o 
arm-none-eabi-objdump -D fun.o 

và kết quả là

00000000 <fun>: 
    0: e0810000 add r0, r1, r0 
    4: e12fff1e bx lr 

Hai đầu vào a và b được truyền trong việc sử dụng r0 và r1. r0-r4 không cần phải được bảo tồn, đặc biệt r0 bởi vì nó là giá trị trả về không thể được bảo toàn. Vì vậy, khi mã C yêu cầu hai toán hạng được thêm vào với nhau, và khi quy ước gọi yêu cầu kết quả được trả về trong r0. r0 = r0 + r1.

Trình biên dịch phải tuân theo quy ước nếu không mã nó tạo ra không hoạt động để bạn có thể biên dịch mã và tháo rời để tìm hiểu một chút về quy ước gọi cho một trình biên dịch và đích cụ thể.

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