2010-07-21 15 views
5

tôi vừa nhìn vào một sản lượng lắp ráp SPARC rất đơn giản mà tôi nhận được từ C programm này:tháo rời ra gcc xuất hiện để làm một "call 0" thay vì "gọi hàm-bù đắp", nhưng hoạt động một cách chính xác

int addition_func(int a, int b) 
{ 
    return(a+b); 
} 

void main() 
{ 

int a = 20; 
int b = 19; 
int res;  

res = addition_func(a, b); 
} 

Tháo lắp phần .text:

00000000 <addition_func>: 
0: 81 c3 e0 08  retl 
4: 90 02 00 09  add %o0, %o1, %o0 

00000008 <main>: 
8: 90 10 20 14  mov 0x14, %o0 
c: 92 10 20 13  mov 0x13, %o1 
10: 82 13 c0 00  mov %o7, %g1 
14: 40 00 00 00  call 14 <main+0xc> 
18: 9e 10 40 00  mov %g1, %o7 
1c: 01 00 00 00  nop 

tôi không hiểu tại sao "gọi là" hướng dẫn nói:

call 14 <main+0xc> 

Tại sao nó không phải là:

call 0 <addition_func+0x0> 

Chương trình hoạt động tốt, tuy nhiên, đầu ra này không có ý nghĩa quá nhiều với tôi. Bất kỳ đề xuất nào tại sao nó được xử lý theo cách này?

Cảm ơn

+0

Có thể sử dụng một chủ đề mô tả hơn .... –

Trả lời

5

Giả sử bạn đang sử dụng GCC, nhưng các trình biên dịch/trình biên dịch khác phải có các tùy chọn tương đương.

Đó không phải là đầu ra lắp ráp; đó là việc tháo gỡ. Nếu bạn muốn đầu vào cho bộ lắp ráp, hãy sử dụng gcc -S.

Số đáng chú ý không phải là 14 - hướng dẫn là một cuộc gọi đến một địa chỉ tương 0:

14: 40 00 00 00  call 14 <main+0xc> 

Nếu bạn đang tháo một đối tượng tập tin biên soạn với -ffunction-sections, sau đó hướng dẫn đơn giản là một là trình giữ chỗ được cố định bởi trình liên kết. Trình liên kết sẽ điền nó với giá trị thực tế là addition_func; bạn có thể thấy điều này nếu bạn đổ các bảng di dời.

+0

Được rồi, vì vậy trình liên kết khắc phục sự cố địa chỉ này. Tôi sẽ có một cái nhìn sâu hơn về vấn đề này, nó không hoàn toàn rõ ràng lý do tại sao nó trông như nó trông – Markus

+0

Nó không phải là một vấn đề; đó là do thiết kế. –