2012-02-24 30 views
6

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?

Trả lời

8

E8 là toán hạng cho "Gọi tương đối", có nghĩa là địa chỉ đích được tính bằng cách thêm toán hạng vào địa chỉ của lệnh tiếp theo. Toán hạng là 0xFFFFFFAE, âm 0x52. 0x808406 - 0x52 là 0x80483b4.

Hầu hết các trình tháo rời giúp tính toán địa chỉ đích thực tế một cách hữu ích hơn là chỉ cung cấp cho bạn địa chỉ tương đối trong toán hạng.

thông tin đầy đủ cho x86 ISA tại địa chỉ: http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-2a-manual.html

6

Câu hỏi thú vị. Tôi đã xem qua số Intel's documentation và mã vạch E8CALL rel16/32. 0xffffffae thực sự là một bổ sung 32 bit của hai số nguyên có dấu bằng -82 thập phân; nó là một địa chỉ tương đối từ byte ngay lập tức sau opcode và các toán hạng của nó.

Nếu bạn làm toán, bạn có thể nhìn thấy nó kiểm tra ra:

0x8048406 - 82 = 0x80483b4

này đặt con trỏ hướng dẫn ở phần đầu của display chức năng.

+0

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 ?? –

+0

@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

+0

@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

3

cuộc gọi gần thường IP tương đối - nghĩa là "địa chỉ" thực sự là một bù đắp từ con trỏ hướng dẫn. Trong trường hợp này, EIP trỏ tới lệnh tiếp theo (vì vậy giá trị của nó là 8048406). Thêm ffffffae (hoặc -00000052 trong phần bổ sung của hai) vào đó và bạn nhận được 80483b4.

Lưu ý rằng tất cả phép tính này là 32 bit. Bạn không thực hiện bất kỳ hoạt động 64 bit nào tại đây (hoặc đăng ký của bạn sẽ có R s thay vì E trong tên của chúng và địa chỉ sẽ lâu hơn).