2012-06-21 15 views
5

tôi nhận được dòng sau trong tháo gỡ từ objdump -d của một chương trình x86 linux ...

4000b0: ba 0e 00 00 00   mov $0xe,%edx 

tôi đang cố gắng để hiểu cách mã máy "ba 0e 00 00 00" bản đồ để "mov $ 0xE,% edx"

Trong hướng dẫn di chuyển tức thời 32-bit là:

B8 + rd ... MOV r32, imm32 

tức là "B8" không phải "BA"

Thực ra không có mã nào của MOV là "BA".

Nếu ai đó có thể chia nhỏ "ba 0e 00 00 00" và giải thích bit-khôn ngoan làm thế nào để có được "mov $ 0xe,% edx" nó sẽ hữu ích nhất.

Trả lời

12

Mã vạch 0xba là "MOV EDX, imm32". Sự nhầm lẫn xuất phát từ hướng dẫn IA sử dụng quá nhiều phím tắt trong việc trình bày mã hóa lệnh, ngay cả đối với các mã byte đơn ngắn như 0xba.

Trong hướng dẫn IA bạn sẽ thấy điều này:

 
B8+ rd MOV r32, imm32 OI Valid Valid Move imm32 to r32. 

có nghĩa là mất 0xb8 và thêm mã hóa của một R32 cụ thể để có được opcode byte thức.

Mã hóa r32 cụ thể nằm trong Bảng 2-2 trong khối lượng 2A.

 
EAX 000 = 0 
ECX 001 = 1 
EDX 010 = 2 
EBX 011 = 3 
ESP 100 = 4 
EBP 101 = 5 
ESI 110 = 6 
EDI 111 = 7 

Phụ lục A trong Tập 2C của tài liệu tham khảo của Intel cũng có thể trợ giúp trong những trường hợp này. Phụ lục này cung cấp bản đồ opcode cho các hướng dẫn 1, 2 và 3 byte. Trong trường hợp của bạn, tìm kiếm opcode byte đơn 0xBA có hướng dẫn là một MOV ngay lập tức vào đăng ký rDX, nơi chiều rộng 'r' phụ thuộc vào các yếu tố khác.

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