2010-05-03 42 views
12

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.

Trả lời

18

Không quan trọng bạn sử dụng mã opcode nào nếu so sánh hai thanh ghi. Sự khác biệt duy nhất là khi so sánh một thanh ghi với toán hạng bộ nhớ, như opcode được sử dụng xác định sẽ được trừ đi từ đó.

Đối với lý do tại sao điều này tồn tại: Định dạng lệnh x86 sử dụng byte ModR/M để biểu thị địa chỉ bộ nhớ hoặc đăng ký. Mỗi lệnh chỉ có thể có một giá trị ModR/M, có nghĩa là nó chỉ có thể truy cập một địa chỉ bộ nhớ (không bao gồm các hướng dẫn đặc biệt như MOVSB). Điều này có nghĩa là không thể có hướng dẫn chung về cmp r/m32, r/m32 và chúng tôi cần hai mã opcodes khác nhau: cmp r/m32, r32cmp r32, r/m32. Như một tác dụng phụ, điều này tạo ra một số dư thừa khi so sánh hai thanh ghi.

+7

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ơ. –

2

CMP ECX, EAX là ECX-EAX và CMP EAX, ECX là EAX-ECX. Các cờ được đặt khác nhau tùy thuộc vào toán hạng nào được so sánh. Tất nhiên bạn có thể có thể lấy đi chỉ với một trong số họ nếu nó không cho cấu trúc mod/r-m của x86.

+1

Điểm là bạn có thể mã hóa cùng một cách ghi nhớ theo hai cách khác nhau vì có một mã vạch khác nhau cho 'cmp r/m, r 'và' cmp r, r/m'. Câu hỏi đặt ra là nếu toán hạng trong MOD/RM có thể là toán hạng bộ nhớ là src1 hoặc src2, và điều đó phụ thuộc vào opcode. –

3

Đó là redundancy of x86. Có rất nhiều trường hợp như thế này. Trình biên dịch/trình biên dịch được tự do sử dụng bất kỳ mã opcodes hợp lệ nào

Một số trình biên dịch cho phép bạn chọn opcode nào phát ra. Ví dụ trên GAS, bạn có thể đính kèm ".s" để sử dụng mã hóa lệnh khác

10 de adcb %bl,%dh 
12 f3 adcb.s %bl,%dh 
Các vấn đề liên quan