Điều đầu tiên bạn cần là một cái gì đó giống như tập tin này . Đây là cơ sở dữ liệu hướng dẫn cho các bộ xử lý x86 được sử dụng bởi trình biên dịch NASM (mà tôi đã giúp viết, mặc dù không phải là các phần thực sự dịch các hướng dẫn). Cho phép chọn một dòng tùy ý từ cơ sở dữ liệu:
ADD rm32,imm8 [mi: hle o32 83 /0 ib,s] 386,LOCK
Điều này có nghĩa là nó mô tả hướng dẫn ADD
. Có nhiều biến thể của hướng dẫn này và biến thể cụ thể được mô tả ở đây là biến thể lấy thanh ghi 32 bit hoặc địa chỉ bộ nhớ và thêm giá trị 8 bit ngay lập tức (nghĩa là hằng số được bao gồm trực tiếp trong lệnh). Một hướng dẫn lắp ráp ví dụ sẽ sử dụng phiên bản này là:
add eax, 42
Bây giờ, bạn cần lấy đầu vào văn bản của bạn và phân tích nó thành các lệnh và toán hạng riêng lẻ. Đối với hướng dẫn ở trên, điều này có thể sẽ dẫn đến một cấu trúc có chứa lệnh ADD
và một mảng các toán hạng (tham chiếu đến thanh ghi EAX
và giá trị 42
). Khi bạn có cấu trúc này, bạn chạy qua cơ sở dữ liệu hướng dẫn và tìm dòng phù hợp với cả tên lệnh và loại toán hạng. Nếu bạn không tìm thấy kết quả khớp, đó là lỗi cần được trình bày cho người dùng ("sự kết hợp bất hợp pháp của opcode và toán hạng" hoặc tương tự là văn bản thông thường).
Khi chúng tôi đã nhận được dòng từ cơ sở dữ liệu, chúng tôi xem xét cột thứ ba, hướng dẫn này là:
[mi: hle o32 83 /0 ib,s]
Đây là một bộ hướng dẫn mô tả cách tạo hướng dẫn mã máy cần thiết:
- Đây
mi
là một mô tả của các toán hạng: một toán hạng modr/m
(thanh ghi hoặc bộ nhớ) (có nghĩa là chúng ta sẽ cần nối thêm một modr/m
byte vào cuối hướng dẫn, chúng ta sẽ đến sau) và một lệnh ngay lập tức (sẽ được sử dụng trong mô tả của hướng dẫn).
- Tiếp theo là
hle
. Điều này xác định cách chúng tôi xử lý tiền tố "khóa". Chúng tôi đã không sử dụng "khóa", vì vậy chúng tôi bỏ qua nó.
- Tiếp theo là
o32
. Điều này cho chúng ta biết rằng nếu chúng ta lắp ráp mã cho định dạng đầu ra 16 bit, thì lệnh cần một tiền tố ghi đè kích thước toán hạng. Nếu chúng tôi đang tạo đầu ra 16 bit, chúng tôi sẽ tạo tiền tố ngay bây giờ ( 0x66
), nhưng tôi sẽ cho rằng chúng tôi không và tiếp tục.
- Tiếp theo là
83
. Đây là một byte theo nghĩa đen trong hệ thập lục phân. Chúng tôi đầu ra nó.
Tiếp theo là /0
. Điều này xác định một số bit bổ sung mà chúng ta sẽ cần trong bytem modr / m và khiến chúng ta tạo ra nó. Các modr/m
byte được sử dụng để đăng ký mã hóa hoặc tài liệu tham khảo bộ nhớ gián tiếp. Chúng tôi có một toán hạng như vậy, một thanh ghi. Thanh ghi có một số, được chỉ định trong tệp dữ liệu khác :
eax REG_EAX reg32 0
Chúng tôi kiểm tra xem reg32
đồng ý với kích thước yêu cầu của hướng dẫn từ cơ sở dữ liệu gốc không. Số 0
đăng ký. Một modr/m
byte là cấu trúc dữ liệu được chỉ định bởi bộ xử lý, trông như thế này:
(most significant bit)
2 bits mod - 00 => indirect, e.g. [eax]
01 => indirect plus byte offset
10 => indirect plus word offset
11 => register
3 bits reg - identifies register
3 bits rm - identifies second register or additional data
(least significant bit)
Bởi vì chúng tôi đang làm việc với một đăng ký, mod
lĩnh vực này là 0b11
.
- Các
reg
lĩnh vực là số sổ đăng ký, chúng tôi đang sử dụng,0b000
- Bởi vì chỉ có một đăng ký trong hướng dẫn này, chúng tôi cần điền vào
rm
trường với một cái gì đó. Đó là những gì dữ liệu bổ sung được chỉ định /0
là dành cho, vì vậy chúng tôi đưa dữ liệu đó vào rm
trường , 0b000
.
- Các
modr/m
vì thế byte là 0b11000000
hay 0xC0
. Chúng tôi đầu ra này.
- Tiếp theo là
ib,s
. Điều này xác định một byte ngay lập tức đã ký. Chúng tôi xem xét các toán hạng và lưu ý rằng chúng tôi có sẵn một giá trị ngay lập tức. Chúng tôi chuyển đổi nó thành một byte đã ký và xuất ra nó ( 42
=> 0x2A
).
Do đó, hướng dẫn lắp ráp hoàn chỉnh là : 0x83 0xC0 0x2A
. Gửi nó đến mô-đun đầu ra của bạn, cùng với một lưu ý rằng không có byte nào tạo thành các tham chiếu bộ nhớ (mô-đun đầu ra có thể cần biết nếu chúng làm như vậy).
Lặp lại cho mọi hướng dẫn. Theo dõi nhãn để bạn biết phải chèn gì khi chúng được tham chiếu. Thêm phương tiện cho các macro và chỉ thị được truyền đến các mô-đun đầu ra tệp đối tượng của bạn. Và đây là cách cơ bản một trình biên dịch hoạt động.