2011-12-07 36 views
7

Ai có thể cho tôi một số thông tin về chức năng gián tiếp gọi trong x86, lắp ráp, hướng dẫn ví dụ nhưx86 lắp ráp hướng dẫn: gọi * Reg

call *Reg 

Vì vậy, nơi địa chỉ của nhãn chức năng được lưu trữ trong một thanh ghi. Bằng cách nào đó tôi không thể tìm thấy thông tin về nó thông qua google.

Và hơn nữa, điều đó có nghĩa là gì nếu tôi nhận được ngoại lệ Trace/breakpoint khi chạy chương trình lắp ráp x86 có lệnh như vậy?

Trả lời

6

Intel và AMD xuất bản tài liệu rất tốt về x86. Đây là liên kết đến tham chiếu tập lệnh Intels (tất nhiên) có phần CALL. http://www.intel.com/design/intarch/manuals/243191.HTM

OP Code: FF /2 
Instruction: CALL r/m32 
Description: Call near, absolute indirect, address given in r/m32 

Sử dụng NASM cú pháp

lbl_start: 
MOV EAX, lbl_function1 
CALL EAX 
RETN 

lbl_function1: 
MOV EAX, 1 
RET 0 

Nếu bạn nhận được một ngoại lệ nó có thể có nghĩa là hầu hết mọi thứ. Dưới đây là một vài vấn đề chung ...

  • bạn không thiết lập sổ đăng ký đến một địa chỉ trong chương trình
    • bạn đang thiết lập các giá trị đăng ký nhưng nó bị thay đổi bởi một cuộc gọi API điều đó xảy ra trước CALL bạn reg32
    • bạn đang thiết lập các giá trị đăng ký để dữ liệu đặt tại một địa chỉ cụ thể chứ không phải là địa chỉ thân
  • bạn đang mã hóa CALL bạn reg32 OP Mã không đúng cách, (ví dụ: FF D0 là CALL EAX in hex)
Các vấn đề liên quan