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.
lẽ Raymond có thể giúp bạn: http://blogs.msdn.com/b/oldnewthing/archive/2004/01/ 14/58579.aspx – ruslik