Tiếp theo là sản phẩm của objdump của một chương trình mẫu,thế hệ toán hạng của lệnh CALL trên x86-64 AMD
080483b4 <display>:
80483b4: 55 push %ebp
80483b5: 89 e5 mov %esp,%ebp
80483b7: 83 ec 18 sub $0x18,%esp
80483ba: 8b 45 0c mov 0xc(%ebp),%eax
80483bd: 89 44 24 04 mov %eax,0x4(%esp)
80483c1: 8d 45 fe lea 0xfffffffe(%ebp),%eax
80483c4: 89 04 24 mov %eax,(%esp)
80483c7: e8 ec fe ff ff call 80482b8 <[email protected]>
80483cc: 8b 45 08 mov 0x8(%ebp),%eax
80483cf: 89 44 24 04 mov %eax,0x4(%esp)
80483d3: c7 04 24 f0 84 04 08 movl $0x80484f0,(%esp)
80483da: e8 e9 fe ff ff call 80482c8 <[email protected]>
80483df: c9 leave
80483e0: c3 ret
080483e1 <main>:
80483e1: 8d 4c 24 04 lea 0x4(%esp),%ecx
80483e5: 83 e4 f0 and $0xfffffff0,%esp
80483e8: ff 71 fc pushl 0xfffffffc(%ecx)
80483eb: 55 push %ebp
80483ec: 89 e5 mov %esp,%ebp
80483ee: 51 push %ecx
80483ef: 83 ec 24 sub $0x24,%esp
80483f2: c7 44 24 04 f3 84 04 movl $0x80484f3,0x4(%esp)
80483f9: 08
80483fa: c7 04 24 0a 00 00 00 movl $0xa,(%esp)
8048401: e8 ae ff ff ff call 80483b4 <display>
8048406: b8 00 00 00 00 mov $0x0,%eax
804840b: 83 c4 24 add $0x24,%esp
804840e: 59 pop %ecx
804840f: 5d pop %ebp
8048410: 8d 61 fc lea 0xfffffffc(%ecx),%esp
gì tôi cần phải hiểu, là ở chính chúng ta thấy sau tại địa chỉ - 8.048.401, cuộc gọi 80483b4, tuy nhiên mã máy là - e8 ae ff ff ff. Tôi thấy rằng lệnh CALL là E8 nhưng địa chỉ của hàm 80483b4 được giải mã thành FFFFFFAE như thế nào? Tôi đã tìm kiếm rất nhiều trong google nhưng nó không trả lại bất cứ thứ gì. Bất cứ ai có thể vui lòng giải thích?
Cảm ơn nhận xét của bạn. Vì vậy, điều này chỉ dành cho các cuộc gọi NEAR. Còn các cuộc gọi FAR thì sao? Từ bình luận của bạn, tôi hiểu rằng cuộc gọi NEAR là E8. FAR có gọi E8 không? Ngoài ra, toán hạng cho cuộc gọi FAR sẽ là addres abosolute ?? –
@SamirBaid Các cuộc gọi Viễn là '9a' và có địa chỉ tuyệt đối. Ngoài ra còn có 'ff' mà làm một cái gì đó với các địa chỉ gián tiếp tuyệt đối, nhưng tôi không chắc chắn làm thế nào những công việc. Xem trang 716 của tập hợp kết hợp (ví dụ: phần trên cùng) trên trang tôi đã liên kết để biết thêm chi tiết. – spencercw
@SamirBaid: Cuộc gọi viễn thông rất hiếm, ngay cả trên x86_64. Các cuộc gọi thư viện thường được thực hiện thông qua một PLT, vì vậy bạn cần một đoạn văn bản lớn hơn 2 GiByte để thực hiện điều đó. – hirschhornsalz