2010-05-03 29 views
11

Tôi thích viết một bộ x86. Tôi tự hỏi một cách tốt để lập bản đồ hướng dẫn lắp ráp x86 lắp ráp (sử dụng một cú pháp giống như Intel) vào các hướng dẫn mã máy nhị phân tương ứng là gì.Làm thế nào để Assemblers Bản đồ x86 Hướng dẫn Mnemonics để hướng dẫn máy nhị phân?

+0

cũng đọc http://stackoverflow.com/questions/2546715/how-to-analysis-how-many-bytes-each-instruction-takes-in-assembly/2761248#2761248 – claws

Trả lời

10

Bạn có muốn hiểu bản đồ vật lý của các bản ghi nhớ đối với mã máy không? Nếu có khối lượng 2A & 2B của số Intel IA32/IA64 reference manuals mô tả định dạng nhị phân của mã máy x86.

x86 instruction set page trên Wikipedia có danh sách nhỏ gọn tất cả các hướng dẫn được phân loại theo thời điểm chúng được giới thiệu, điều này có thể giúp bạn ưu tiên những gì cần triển khai trước. Tuy nhiên, nếu bạn hỏi về cách phân tích cú pháp một tệp văn bản mã lắp ráp để đến điểm mà chương trình của bạn có thể bắt đầu viết ra mã máy thì bạn về cơ bản cần hiểu cách viết trình biên dịch. Các công cụ lex và yacc là những nơi tốt để bắt đầu nhưng nếu bạn không biết cách xây dựng trình biên dịch, bạn cũng sẽ cần phải có một cuốn sách. Tôi nghĩ rằng Dragon book là một trong những tốt nhất hiện có nhưng có bất kỳ số lượng sách khác bạn có thể sử dụng, SO có rất nhiều khuyến nghị.

+0

Bạn có thể không cần trình biên dịch chính thức cho việc này. Bạn cần một trình biên dịch hai pass đơn giản với một số loại bảng tra cứu. Bạn có thể không phải luôn luôn tạo ra mã tốt nhất theo cách đó, nhưng bạn sẽ nhận được một cái gì đó hoạt động. –

+0

@Nathan: Một trình biên dịch * là * trình biên dịch chính thức. Hãy ghi nhớ, một trình biên dịch chỉ là một dịch giả từ một số ngôn ngữ khác sang mã opcodes. Nếu bạn đếm toàn bộ quá trình dịch thuật, một trình biên dịch và trình biên dịch sẽ làm chính xác điều tương tự. Nó chỉ xảy ra rằng hầu hết các ngôn ngữ khác là đủ phức tạp, và ngôn ngữ lắp ráp đủ đơn giản, assembly đó đóng vai trò như một điểm trung bình - vì vậy rất nhiều trình biên dịch tách bản dịch ra thành hai giai đoạn: dịch thành lắp ráp, và có một assembler làm công việc grunt thực sự tạo ra opcodes. Một người lắp ráp thường sẽ không được hưởng lợi từ việc này. – cHao

+0

@cHao: Cảm ơn bạn đã làm rõ. Đó là một điểm thú vị :-) –

5

Đối với x86, nó phức tạp như địa ngục. Một chút ít phức tạp hơn kể từ khi bộ vi xử lý 32-bit đã qua, nhưng yeah. Vẫn là một nỗi đau.

Bạn có thể muốn xem qua nasm (http://www.nasm.us). Nó là một bộ mã nguồn mở 32 bit. Xem cách họ làm điều đó. Hoặc, sử dụng nó thay thế. :)

2

Đây chỉ là ánh xạ trực tiếp một đối một; tài liệu của Intel mô tả tất cả các hướng dẫn và mã hóa của chúng. Bạn sẽ cần phải xây dựng một bảng tra cứu khổng lồ hoặc một cái gì đó tương đương để làm việc kết hợp và tạo mã.

+8

điều gì đó cho tôi biết bạn chưa bao giờ xem mã hóa x86. một mnemonic duy nhất có thể tương ứng với nhiều opcodes, mỗi opcode có thể có nhiều tiền tố, ghi đè kích thước ... và tôi chắc chắn rằng tôi đang thiếu một số thứ. – Bahbar

+0

Tôi viết mã lắp ráp x86 mỗi ngày. Nó phải là một đối một, nếu không làm thế nào để bạn biết opcode nào được phát ra cho hướng dẫn mà bạn đã viết? Chỉ vì có tiền tố, sửa đổi đặc biệt, truy cập bộ nhớ hoặc phiên bản đăng ký, v.v. không thay đổi thực tế là đối với mỗi lệnh bạn viết trong tệp lắp ráp, bạn phải biết hướng dẫn máy nào được phát ra .... –

+0

Tôi lấy trở lại; nó có thể là nhiều-một, nếu bạn muốn có nhiều bộ nhớ tạo ra cùng một lệnh máy. Nó không thể là một-nhiều, mặc dù, trừ khi bạn xây dựng một số loại nhạy cảm ngữ cảnh vào lắp ráp. Trường hợp đầu tiên là công việc không cần thiết, và trường hợp thứ hai có vẻ như một ý tưởng tồi nói chung, vì vậy tôi sẽ để cho câu trả lời của tôi đứng. –

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