Trong khi xây dựng lắp ráp của tôi cho nền tảng x86 tôi gặp phải một số vấn đề với mã hóa các JMP
hướng dẫn:Làm thế nào là một JMP tương đối (x86) thực hiện trong một Assembler?
OPCODE INSTRUCTION SIZE
EB cb JMP rel8 2
E9 cw JMP rel16 4 (because of 0x66 16-bit prefix)
E9 cd JMP rel32 5
...
(từ website lệnh x86 yêu thích của tôi, http://siyobik.info/index.php?module=x86&id=147)
Tất cả đều tương nhảy, trong đó kích thước của mỗi mã hóa (toán hạng + toán hạng) nằm trong cột thứ ba.
Thiết kế ban đầu của tôi (và do đó do lỗi này) đã dành khoảng không gian tối đa (5 byte) cho mỗi lệnh. Toán hạng chưa được biết, bởi vì đó là một bước nhảy đến một vị trí chưa biết. Vì vậy, tôi đã thực hiện một "viết lại" cơ chế, mà viết lại các toán hạng ở vị trí chính xác trong bộ nhớ, nếu vị trí của nhảy được biết đến, và điền phần còn lại với NOP
s. Đây là một mối quan tâm hơi nghiêm trọng trong các vòng thắt chặt.
Bây giờ vấn đề của tôi là với các tình huống sau đây:
b: XXX
c: JMP a
e: XXX
...
XXX
d: JMP b
a: XXX (where XXX is any instruction, depending
on the to-be assembled program)
Vấn đề là tôi muốn mã hóa nhỏ nhất có thể cho một hướng dẫn JMP
(và không có NOP
điền).
Tôi phải biết kích thước của lệnh tại c
trước khi tôi có thể tính khoảng cách tương đối giữa a
và b
cho toán hạng tại d
. Điều tương tự cũng áp dụng cho số JMP
tại c
: cần biết kích thước của d
trước khi có thể tính khoảng cách tương đối giữa e
và a
.
Làm thế nào để các trình lắp ráp hiện có giải quyết được vấn đề này hoặc bạn sẽ làm như thế nào?
Đây là những gì tôi đang suy nghĩ mà giải quyết vấn đề:
Đầu tiên mã hóa tất cả các hướng dẫn để opcodes giữa
JMP
và đó là mục tiêu, nếu khu vực này chứa một opcode biến kích thước, sử dụng kích thước tối đa , ví dụ5
cho sốJMP
. Sau đó mã hóa tương đốiJMP
thành mục tiêu của nó, bằng cách chọn kích thước mã hóa nhỏ nhất có thể (3, 4 hoặc 5) và tính khoảng cách. Nếu bất kỳ opcode có kích thước biến nào được mã hóa, hãy thay đổi tất cả các toán hạng tuyệt đối trước và tất cả các lệnh tương đối bỏ qua hướng dẫn được mã hóa này: chúng được mã hóa lại khi toán hạng của chúng thay đổi để chọn kích thước nhỏ nhất có thể. Phương pháp này được đảm bảo kết thúc, vì opcodes có kích thước biến chỉ có thể thu nhỏ (vì nó sử dụng kích thước tối đa của chúng).
Tôi tự hỏi, có lẽ đây là giải pháp được thiết kế quá mức, đó là lý do tôi đặt câu hỏi này.
+1 cho liên kết tốt đẹp tài liệu asm –