2010-09-23 21 views
8

Tôi đang trải qua một tai nạn, và trong khi điều tra tôi thấy mình hoàn toàn bị chặn bởi các đoạn mã sau:Rắc rối hiểu một chức năng x86-64 lời mở đầu

0000000000000a00 <_IO_vfprintf>: 
a00:  55      push %rbp 
a01:  48 89 e5    mov %rsp,%rbp 
a04:  41 57     push %r15 
a06:  41 56     push %r14 
a08:  41 55     push %r13 
a0a:  41 54     push %r12 
a0c:  53      push %rbx 
a0d:  48 81 ec 48 06 00 00 sub $0x648,%rsp 
a14:  48 89 95 98 f9 ff ff mov %rdx,0xfffffffffffff998(%rbp) 

này được tạo ra bằng cách chạy objdump --disassemble /usr/lib64/libc.a trên 64-bit Linux x86 hệ thống, và sau đó tìm kiếm thông qua đầu ra. Đây là AT&T syntax, vì vậy các điểm đến ở bên phải.

Cụ thể, tôi không hiểu hướng dẫn cuối cùng. Dường như đang viết giá trị của số rdx đăng ký vào bộ nhớ ở đâu đó trên ngăn xếp (cách xa), trước khi hàm đã chạm vào thanh ghi đó. Đối với tôi, điều này không có ý nghĩa gì cả.

Tôi đã thử đọc trên các quy ước gọi và lý thuyết tốt nhất của tôi bây giờ là rdx được sử dụng cho tham số, vì vậy, mã cơ bản "trả về" giá trị tham số trực tiếp. Đây không phải là kết thúc của chức năng, vì vậy nó không thực sự trở lại, tất nhiên.

+0

lẽ Raymond có thể giúp bạn: http://blogs.msdn.com/b/oldnewthing/archive/2004/01/ 14/58579.aspx – ruslik

Trả lời

12

Có, đó là thông số. Các ABI used by Linux gán lên đến 6 "INTEGER" (< = 64-bit số nguyên, hoặc con trỏ) gõ tham số để đăng ký, trong rõ ràng và dễ nhớ để %rdi, %rsi, %rdx, %rcx, %r8, %r9.

Khung ngăn xếp là 1648 byte (sub $0x648,%rsp xác nhận quyền sở hữu 1608 byte, cộng với 5 đăng ký 64 bit đã được đẩy trước đó) và 0xfffffffffffff998 là -1640.

Vì vậy, mã sẽ lưu trữ thông số thứ 3 gần cuối khung ngăn xếp.

(Lưu ý:. Windows 64-bit ABI khác với Linux một)

+0

Tuyệt vời, cảm ơn. Tôi thực sự cần phải mất một thời gian (5-10 năm hoặc lâu hơn) và trở lại vào rãnh với lập trình lắp ráp. – unwind

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