Câu hỏix86 CMP Hướng dẫn Difference
sự (không tầm thường) khác biệt giữa hai lệnh x86 Sau đây là gì?
39 /r CMP r/m32,r32 Compare r32 with r/m32
3B /r CMP r32,r/m32 Compare r/m32 with r32
nền
Tôi đang xây dựng một nhà lắp ráp Java, mà sẽ được sử dụng bởi trình biên dịch ngôn ngữ trung gian của tôi để tạo ra Windows-32 thực thi.
Hiện nay tôi có mã sau đây:
final ModelBase mb = new ModelBase(); // create new memory model
mb.addCode(new Compare(Register.ECX, Register.EAX)); // add code
mb.addCode(new Compare(Register.EAX, Register.ECX)); // add code
final FileOutputStream fos = new FileOutputStream(new File("test.exe"));
mb.writeToFile(fos);
fos.close();
Để ra một tập tin thực thi hợp lệ, trong đó có hai hướng dẫn CMP trong một TEXT-phần. Các thực thi xuất ra "text.exe" sẽ không làm gì thú vị, nhưng đó không phải là điểm. Lớp Compare
là một trình bao bọc xung quanh hướng dẫn CMP
.
Đoạn mã trên tạo ra (kiểm tra với OllyDbg):
Address Hex dump Command
0040101F |. 3BC8 CMP ECX,EAX
00401021 |. 3BC1 CMP EAX,ECX
Sự khác biệt là tinh tế: nếu tôi sử dụng 39
byte-opcode:
Address Hex dump Command
0040101F |. 39C1 CMP ECX,EAX
00401021 |. 39C8 CMP EAX,ECX
Mà làm cho tôi băn khoăn về synonymity và họ tại sao điều này thậm chí còn tồn tại.
Những mức độ tự do 1-bit này cũng cung cấp một kênh bí mật cho các trình biên dịch thành "điện thoại nhà" - chúng có thể "đóng dấu" các tệp nhị phân mà chúng tạo ra, và nhà cung cấp trình biên dịch có thể yêu cầu bạn giải thích nếu họ tìm thấy phần mềm của bạn nhưng không có giấy phép trong hồ sơ. –