2011-11-20 36 views
6

Thỉnh thoảng chúng ta phải phân tích từng phần mã lắp ráp (IA32), và hơn thường tôi đi qua một lệnh trông như thế này:XOR đăng ký, đăng ký (lắp ráp)

xor ax, ax 

hoặc với các thanh ghi khác là: xor dx, dx, xor al, al, ...

Chính xác điều này làm gì? (Rìu xor ax luôn mang đến 0?)

+0

Duplicate của http://stackoverflow.com/questions/1396527/any-reason-to-do-a-xor-eax-eax – mark4o

+0

http://stackoverflow.com/questions/33666617/which-is-best-way-to-set-a-register-to-zero-in -x86-assembly-xor-mov-or-và (xor là cách tốt nhất) –

Trả lời

13

Đó là một nhà lắp ráp thành ngữ phổ biến để thiết lập một đăng ký để 0.

xor ax, ax tương ứng với ax = ax^ax đó, như bạn đã thông báo, là một cách hiệu quả ax = 0.

Nếu tôi nhớ chính xác lợi thế chính là rằng mã kích thước của nó nhỏ hơn mov ax, 0

+0

Cảm ơn, tôi im agined nó đã được một cái gì đó khác với thiết lập nó để 0 vì tôi sẽ sử dụng 'mov ax, 0' cho rằng, nhưng nếu nó tạo ra một mã ngắn hơn kích thước nó làm cho ý nghĩa hơn thực sự. – Aerus

2

Đó là chính xác những gì nó làm - zero nội dung của một thanh ghi

1

xor% rìu, rìu%, như đã nêu trong các chú thích trước đó tương ứng với ax ax ax ax ax ax. Điều này về cơ bản thiết lập ax = 0. Ngoài ra, nó cũng ảnh hưởng/sửa đổi một số các EFLAGS như OF, CF, SF, PF hoặc ZF. Trong trường hợp này, cờ PF và ZF sẽ được thiết lập.

SF - Cho biết kết quả của các hoạt động cuối cùng dẫn đến một giá trị có chút quan trọng nhất được thiết lập để 1.

PF - Chỉ ra nếu số lượng set bit là số lẻ hoặc thậm chí trong biểu diễn nhị phân của kết quả của hoạt động cuối cùng.

ZF - Nó được đặt nếu kết quả của phép toán/logic là 0 hoặc đặt lại theo cách khác.

Ví dụ được hiển thị bên dưới bằng đoạn mã GDB.

Hướng dẫn: xor% rìu, rìu%

Trước khi "xor"

(gdb) info registers 
eax   0xaa55 43605 
ecx   0x0 0 
edx   0x80 128 
ebx   0x0 0 
esp   0x6f20 0x6f20 
ebp   0x0 0x0 
esi   0x0 0 
edi   0x0 0 
eip   0x7c02 0x7c02 
eflags   0x2 [ ] 
cs    0x0 0 
ss    0x0 0 
ds    0x0 0 
es    0x0 0 
fs    0x0 0 
gs    0x0 0 

Sau "xor"

(gdb) info registers 
eax   0x0 0   --------------------> AX = 0   
ecx   0x0 0 
edx   0x80 128 
ebx   0x0 0 
esp   0x6f20 0x6f20 
ebp   0x0 0x0 
esi   0x0 0 
edi   0x0 0 
eip   0x7c04 0x7c04 
eflags   0x46 [ PF ZF ] --------------------> Flags Set 
cs    0x0 0 
ss    0x0 0 
ds    0x0 0 
es    0x0 0 
fs    0x0 0 
gs    0x0 0 
+0

Chào mừng bạn đến với SO. Câu trả lời này chi tiết hơn là hữu ích, IMO. Bạn không cần phải giải thích cách tất cả các cờ hoạt động trong câu trả lời cho một câu hỏi về một thành ngữ zeroing. Nó sẽ là đủ để lại một bình luận chỉ ra rằng không giống như 'mov reg, 0', xor ảnh hưởng đến cờ. Kể từ khi câu trả lời của bạn xuất hiện câu hỏi này trên trang trước hoạt động gần đây, tôi đã kết thúc để lại một bình luận cho một câu hỏi với một liên kết đến một câu trả lời chi tiết hơn về lý do tại sao xor là cách tốt nhất để không regs. (Nơi tôi đã đề cập rằng trong hầu hết các trường hợp, làm zeroing trước khi hướng dẫn có kết quả cờ bạn muốn.) –

+0

Cảm ơn .. Tôi đồng ý nó có nhiều chi tiết hơn cần thiết. Tôi nhận thấy nó ngay bây giờ. – scanjee

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