2011-01-20 64 views
32

tôi nhận được vào lắp ráp và tôi tiếp tục chạy vào xor, ví dụ:Ý nghĩa của XOR trong lắp ráp x86 là gì?

xor  ax, ax 

Liệu nó chỉ rõ ràng giá trị của thanh ghi?

+3

Là một chất làm ngọt, điều này bây giờ là * cách * thích không đăng ký trên kiến ​​trúc vi mô x86-64 hiện đại. Nó không yêu cầu bất kỳ đơn vị thực thi nào (chủ yếu được xử lý trong bộ giải mã), loại bỏ hiệu quả các quầy hàng (chờ đợi) trên thanh ghi dst = src, và phá vỡ một phần cờ đăng ký quầy hàng. –

+0

có thể trùng lặp của [Bất kỳ lý do nào để thực hiện "xor eax, eax"?] (Http://stackoverflow.com/questions/1396527/any-reason-to-do-a-xor-eax-eax) –

Trả lời

41

A XOR B bằng tiếng Anh sẽ được dịch là "là A và B không bằng nhau". Vì vậy, xor ax, ax sẽ đặt ax thành 0 vì rìu luôn bằng chính nó.

A B | A XOR B 
0 0 | 0 
1 0 | 1 
0 1 | 1 
1 1 | 0 
+0

Đây là Thực sự hữu ích. Câu trả lời này đã giúp tôi trong RE, vì vậy chỉ trong trường hợp: Nó sẽ dịch thành một cái gì đó như 'if (A! = B)' trong một ngôn ngữ cấp cao. – TheRookierLearner

+4

@TheRookierLearner: 'Một XOR B' là một khối xây dựng nguyên thủy cho các cấu trúc cấp cao hơn. Nó * có thể được sử dụng * để thực hiện '(A! = B)', nhưng nó là một hoạt động khác biệt rõ ràng theo đúng nghĩa của nó. Ngoài ra, tuyên bố của nightcracker rằng 'A XOR B' trong tiếng Anh sẽ được dịch là" A và B không bằng nhau "là chỉ đúng khi bạn nhìn vào kết quả từ một quan điểm Boolean zero/nonzero. Một ứng dụng phổ biến của XOR là để chuyển đổi một hoặc nhiều bit của một số bit đầu vào: kết quả của 'A XOR 1' là đảo ngược của chỉ bit thấp của A. – phonetagger

+0

Rất cám ơn cho các ứng dụng khác nữa! – TheRookierLearner

3
A B | XOR 
0 0 | 0 
1 0 | 1 
0 1 | 1 
1 1 | 0 

Lệnh XOR thực hiện thao tác trên trên mỗi cặp bit trong hai toán hạng. Vì vậy, 0xFF xor 0xFF sẽ là 0x000x55 xor 0xAA sẽ là 0xFF. Và có, xor ax ax xóa ax.

14

xor reg, reg thường được sử dụng để xóa đăng ký. Nó có thể là một thay thế cho mov reg, 0

AFAIR, nó nhanh hơn (hoặc ngắn hơn) trong một số trường hợp.

Và tất nhiên, XOR chính nó là độc quyền OR (aka: độc quyền phân ly) hoạt động (nhưng đó là một sự xấu hổ để mô tả ở đây cơ bản như vậy - sử dụng Wikipedia)

5

xor register, register thường được dùng để 'zero' một thanh ghi, vì tất cả các bit được so sánh với nhau:

0 bit không đổi. 1-bit trở thành số không, bởi vì 1 XOR 1 cũng 0.

1

là Nó xác định logic độc quyền HOẶC

0 XOR 0 = 0 
0 XOR 1 = 1 
1 XOR 0 = 1 
1 XOR 1 = 0 

Vì vậy, TRUE chỉ khi một trong những biểu hiện là sự thật, không phải cả hai.

3

xor = exclusive hoặc. Xem định nghĩa của wikipedia cho Exclusive or.

Nếu bạn xor đăng ký với chính nó, nó sẽ bằng không đăng ký.

0 xor 0 = 0 
0 xor 1 = 1 
1 xor 0 = 1 
1 xor 1 = 0 

Hãy lấy giá trị 41 làm ví dụ (ở dạng nhị phân):

101001 
xor 101001 
    = 000000 
2

Trong trường hợp này nó sẽ xóa sổ đăng ký ... XOR là một "độc quyền hay" ... vì vậy nếu rìu chứa 1010 và bạn độc quyền hoặc với 1010 bạn sẽ nhận được 0000 (đã xóa)

1

Nếu tôi nhớ không lầm xor rìu, rìu là một hướng dẫn lắp ráp một byte, trong khi mov ax, 0 sẽ có ít nhất 3 và có lẽ sẽ phải mất một chút thời gian để thực hiện. Nó chắc chắn sẽ mất nhiều thời gian để giải mã hơn lệnh xor.

+0

Phụ thuộc vào bittage, nhưng xor (e) axe, (e) rìu là hai byte. –

+0

@Jens: Chắc chắn, nhưng câu hỏi là về rìu, không phải là eax! – Sean

+0

Nếu bạn đang ở chế độ 16 bit, lệnh này là hai byte. Nếu 32 bit, 3 byte. –

7

xor ax, ax là cách nhanh nhất có thể để đặt thanh ghi rìu thành 0. Nhanh nhất về kích thước của hướng dẫn và số hướng dẫn. Để biết chi tiết về cách nó hoạt động, bạn cần một chút kiến ​​thức về số học bit.

Thao tác XOR giữa hai bit trả về 1 nếu một và chỉ của hai bit là 1; 0 nếu không. Một cách khác để giải thích là nó trả về 1 nếu hai bit khác nhau; 0 nếu không.

Thao tác XOR giữa hai số nhị phân có cùng độ dài hoạt động tương tự trên cơ sở từng bit một. XOR hai số bạn nhận được một số với bit được đặt thành 1 trong đó các bit tương ứng của hai toán hạng khác nhau, 0 khi các bit tương ứng giống nhau.

Từ kiến ​​thức này khá dễ dàng để thấy rằng nếu hai toán hạng đều giống nhau (rìu và rìu ví dụ) kết quả sẽ là 0.

+0

Ở chế độ 32 bit hoặc 64 bit, sẽ nhanh hơn nếu không có rìu với 'xor eax, eax'. Mã hóa ngắn hơn và không phụ thuộc sai vào giá trị trước của 16b trên. Trong chế độ 16b trên một CPU hiện đại, có lẽ 'xor eax, eax' vẫn tốt hơn, vì [nhiều lợi ích đặc biệt của việc sử dụng một thành ngữ zeroing được công nhận] (http://stackoverflow.com/questions/33666617/which-is- best-way-to-set-a-đăng ký-to-zero-in-x86-assembly-xor-mov-hoặc-và/33668295 # 33668295) –

2

Khi tôi bắt đầu lập trình một thời gian dài trước là nó không có độc quyền hay trên bộ xử lý hoặc trong trình biên dịch. Khi tôi xung quanh để nó tôi bị mắc kẹt vào giới thiệu:

  • hay: true nếu a = 1 hoặc b = 1 hoặc cả hai = 1
  • xor: true nếu a = 1 hoặc b = 1 nhưng không phải cả hai = 1

vậy:

0 or 0 = 0 
0 or 1 = 1 
1 or 0 = 1 
1 or 1 = 1 

0 xor 0 = 0 
0 xor 1 = 1 
1 xor 0 = 1 
1 xor 1 = 0 
1

xor rìu, rìu được sử dụng để thiết lập rìu để 0.

Lý do: hướng dẫn thường xor trên bất kỳ bộ xử lý mất byte ít hơn trong lắp ráp, vì sử dụng movl 0,%ax

+6

Điều này dường như không thêm bất kỳ điều gì vào các câu trả lời trước đã đề cập đến cùng điều chi tiết hơn. –

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