2010-03-09 11 views
8

chuyên gia, tôi tự hỏi các intel x86 machineCode/assemblyCode chuyển đổi là singleSide hoặc cả haiSide?intel mã máy để lắp ráp mã câu hỏi

có nghĩa là: assemblyCode ---> machineCode và machineCode ---> assemblyCode đều khả dụng.

vì mã máy x86 có kích thước khác nhau (1-15 byte) và mã opcode khác nhau (1-3 byte), cách xác định một mã vạch là 1byte hoặc 2byte hoặc 3byte?

và tôi không bao giờ tìm thấy ví dụ về tiền tố của lệnh x86, nếu đây là tiền tố 1byte, cách xác định tiền tố là tiền tố hoặc opcode?

chắc chắn, assemblyCode ---> machineCode, danh tính của mnemonics + oprand [w/b] có thể xác định xem machineCode phản hồi là gì bằng cách ánh xạ MappingTable nhất định.

nhưng, khi quá trình này bị đảo ngược:

{bbbbbbbb, bbbbbbbb, bbbbbbbb, // instruction1 bbbbbbbb, bbbbbbbb, bbbbbbbb, bbbbbbbb, bbbbbbbb, bbbbbbbb, // instruction2 bbbbbbbb, bbbbbbbb // instruction3 }

----> {bbbbbbbb, bbbbbbbb, bbbbbbbb, bbbbbbbb, bbbbbbbb, bbbbbbbb, bbbbbbbb, bbbbbbbb, bbbbbbbb, bbbbbbbb, bbbbbbbb}

tôi không biết đó là các bit có ý nghĩa hoặc byts để xác định bao lâu (kích thước) một instru ction là.

bất kỳ ai có thể cho tôi biết cách xác định điều đó không? (Kích thước của opcode, ví dụ tiền tố.) cảm ơn sự trợ giúp.

Trả lời

3

Chi tiết bạn cần có trong Intel® 64 and IA-32 ArchitecturesSoftware Developer’s Manual Volume 2B: Instruction Set Reference, N-Z. Xem Phụ lục A, nó bao gồm mọi thứ bạn cần.

+0

cảm ơn, tôi sẽ tra cứu nó. – Johnny

+0

cảm ơn, tôi đã đọc: Bảng A-2. Bản đồ Opcode một byte: (00H - F7H) 0F LOCK (Tiền tố) Bảng A-3. Bản đồ mã hóa hai byte: 00H - 77H (Byte đầu tiên là 0FH) Bảng A-3. Bản đồ Opcode hai byte: 08H - 7FH (Byte đầu tiên là 0FH) Bảng A-3. Bản đồ Opcode hai byte: 80H - F7H (Byte đầu tiên là 0FH) Bảng A-3. Bản đồ Opcode hai byte: 88H - FFH (Byte đầu tiên là 0FH) – Johnny

+0

Bảng A-4. Bản đồ mã hóa ba byte: 00H - F7H (Hai byte đầu tiên là 0F 38H) Bảng A-4. Bản đồ Opcode ba byte: 08H - FFH (Hai byte đầu tiên là 0F 38H) Bảng A-5. Bản đồ Opcode ba byte: 00H - F7H (Hai byte đầu tiên là 0F 3AH) Bảng A-5. Bản đồ Opcode ba byte: 08H - FFH (Hai byte đầu tiên là 0F 3AH) nó rất hữu ích, cảm ơn. – Johnny

3

Không chắc chắn những gì bạn muốn thực hiện, nhưng vì hướng dẫn có độ dài thay đổi, cách duy nhất để đảm bảo bạn lấy lại mã được tháo rời chính xác là bắt đầu từ địa chỉ bắt đầu đã biết. Thông thường các bộ tách rời bắt đầu từ điểm bắt đầu của chương trình và sau đó đệ quy tháo rời tất cả các phương thức được gọi. Tuy nhiên, điều này dẫn đến tình huống mà một số đoạn mã không được tháo rời vì chúng có thể được gọi từ bảng chức năng hoặc các tình huống tương tự, vì vậy cần giúp đỡ từ người thường để xem các phần còn lại là mã hay dữ liệu.

+0

... hiện bản concernde này bằng elf hoặc định dạng obj khác không? – Johnny

+0

có, tháo rời ---> tôi quên sử dụng từ này. tôi nghĩ, nếu tôi có thể tháo rời, thì tôi có thể lắp ráp. – Johnny

+0

Điều này có thể được áp dụng cho bất kỳ định dạng đối tượng nào, nhưng tất nhiên quy trình xử lý cần tính đến định dạng tệp thực tế. – rslite

2

kể từ x86 machineCode là khác nhau về kích thước (1-15 byte), và opcode khác nhau về (1-3 byte), làm thế nào để xác định một opcode là 1byte hoặc 2byte hoặc 3byte?

Kích thước của hướng dẫn được xác định ngầm định theo hướng dẫn và chế độ địa chỉ, bạn sẽ phải kiểm tra ISA một byte tại thời điểm có thể và nên theo byte đã cho.

và tôi không bao giờ tìm thấy những ví dụ về tiền tố của lệnh x86, nếu đây là 1byte tiền tố, làm thế nào để xác định nó là tiền tố hoặc opcode?

Ví dụ: tiền tố ghi đè kích thước toán hạng (66h) luôn là tiền tố.

+0

cảm ơn, bạn có thể viết một tiền tố đầy đủ + opcode + chế độ + r/m + ví dụ oprands? – Johnny

+0

làm thế nào về kích thước opcode? (không phải hướng dẫn), – Johnny

+0

Sách hướng dẫn cài đặt Intel Instreuction có các bảng mã hóa mở rộng của mã opcode và mod-reg-r/m byte. Kiểm tra Chương 2 của tài liệu này, ví dụ: http://www.intel.com/design/intarch/manuals/243191.htm –