2012-03-22 42 views
12

Có nghi ngờ về việc chuyển đổi mã hex của lệnh máy JMP. Tôi có địa chỉ tuyệt đối mà tôi muốn chuyển sang, nói "JMP 0x400835". Trước hết, điều này có được phép không? Nếu có, mã hex tương ứng là gì? Nếu không, trước tiên tôi có thể lưu trữ địa chỉ trong một số thanh ghi, nói EAX và sau đó đặt "JMP EAX"? Tôi đang làm việc trên kiến ​​trúc x86 (64b).Hướng dẫn JMP - Mã Hex

Tôi đã cố gắng in mã hex từ đầu ra diassem trong gdb, nhưng không có tính nhất quán, tức là, tôi không thấy địa chỉ đích trong mã hex.

Tôi mới dùng mã hex và hướng dẫn máy, vì vậy hãy tha thứ cho sự thiếu hiểu biết của tôi.

Trả lời

23

Không có bước nhảy nào của biểu mẫu JMP absaddr đến địa chỉ tuyệt đối ở chế độ 64 bit. Toán hạng của bước nhảy luôn là chuyển vị tương đối 32 bit thành rip, có dấu mở rộng tới 64 bit.

Lý do bạn thấy không có sự nhất quán có thể là chênh lệch phụ thuộc vào con trỏ lệnh hiện tại và bạn không nhận ra điều đó.

jmp eax không được phép, vì địa chỉ tất nhiên luôn rộng 64 bit trên kiến ​​trúc 64 bit. Một chuỗi mov rax, addr + jmp rax là có thể, nó sẽ trông như

48 c7 c0 35 08 40 00   mov rax, 0x00400835 
ff e0       jmp rax 

hoặc

48 b8 35 08 40 00 00 00 00 00 mov rax, 0x0000000000400835 
ff e0       jmp rax 

Làm sao tôi biết các mã hex? Vâng, tôi đã yêu cầu trình biên dịch của tôi. Tôi biên soạn với gcc -c và tháo rời với objdump. Tôi không bận tâm đến việc sử dụng cú pháp của Intel, bởi vì tôi không cần nó. Vì vậy, đây là trong cú pháp AT & T.

echo 'asm("mov $400835, %rax\n jmp *%rax\n");' > test.c 
gcc -c test.c 
objdump -d test.o 
+0

Cảm ơn bạn đã trả lời. Điều này thực sự đã giúp tôi. objdump nghiêm túc là một công cụ tốt! –

+0

Hey .. Tôi đã đánh dấu bài đăng của bạn là "hữu ích" .. đó là những gì tôi cần, đúng không? –

+0

@DeepanjanMazumdar Bạn cần phải bấm vào dấu kiểm – hirschhornsalz

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