2011-11-20 367 views
6

不時我們要分析的彙編代碼段(IA32), 超過我常常遇到,看起來像這樣的指令:XOR寄存器,寄存器(彙編)

xor ax, ax 

或其他寄存器也如此:xor dx, dxxor al, al,...

這到底是什麼? (斧斧XOR總是給人0?)

+0

複製後前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-and(xor是最好的方法) –

回答

13

這是一個常見的彙編成語寄存器設置爲0。

xor ax, ax對應ax = ax^ax其中,因爲你已經通知,是有效ax = 0

如果我沒有記錯的主要優點是,它的代碼尺寸小於mov ax, 0

+0

謝謝,我im因爲我會使用'mov ax,0',但是如果它產生更短的代碼量,它確實會更有意義。 – Aerus

2

這正是它 - 零寄存器

1

XOR%斧,斧%的內容,正如前面的評論所述,對應於ax = ax xor ax。這基本上設置ax = 0。另外,它還影響/修改一些EFLAGS,如OF,CF,SF,PF或ZF。在這種情況下,PF和ZF標誌將被設置。

SF - 表示上次操作的結果是否導致其最顯著位被設置爲1。

PF的值 - 表示組的位的數目是奇數還是偶數中的二進制表示最後一次操作的結果。

ZF - 如果數學/邏輯運算的結果爲零或否則復位,則置位。

示例如下所示,使用GDB片段。

指令: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 

「異或」

(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

歡迎來到SO。這個答案比IMO更有用。你不需要解釋所有的標誌如何回答關於歸零習慣的問題。留下一條評論指出,與'mov reg,0'不同,xor會影響標誌。既然你的回答將這個問題提到了最近的活動頭版,我最後留下了一個問題的評論,並附有關於爲什麼xor是零註冊最佳方式的更詳細答案的鏈接。 (在我提到的情況下,在大多數情況下,在你想要的標誌結果指令之前進行調零。) –

+0

謝謝..我同意它有比需要更多的細節。我現在注意到它。 – scanjee