不時我們要分析的彙編代碼段(IA32), 超過我常常遇到,看起來像這樣的指令:XOR寄存器,寄存器(彙編)
xor ax, ax
或其他寄存器也如此:xor dx, dx
,xor al, al
,...
這到底是什麼? (斧斧XOR總是給人0?)
不時我們要分析的彙編代碼段(IA32), 超過我常常遇到,看起來像這樣的指令:XOR寄存器,寄存器(彙編)
xor ax, ax
或其他寄存器也如此:xor dx, dx
,xor al, al
,...
這到底是什麼? (斧斧XOR總是給人0?)
這是一個常見的彙編成語寄存器設置爲0。
xor ax, ax
對應ax = ax^ax
其中,因爲你已經通知,是有效ax = 0
。
如果我沒有記錯的主要優點是,它的代碼尺寸小於mov ax, 0
謝謝,我im因爲我會使用'mov ax,0',但是如果它產生更短的代碼量,它確實會更有意義。 – Aerus
這正是它 - 零寄存器
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
歡迎來到SO。這個答案比IMO更有用。你不需要解釋所有的標誌如何回答關於歸零習慣的問題。留下一條評論指出,與'mov reg,0'不同,xor會影響標誌。既然你的回答將這個問題提到了最近的活動頭版,我最後留下了一個問題的評論,並附有關於爲什麼xor是零註冊最佳方式的更詳細答案的鏈接。 (在我提到的情況下,在大多數情況下,在你想要的標誌結果指令之前進行調零。) –
謝謝..我同意它有比需要更多的細節。我現在注意到它。 – scanjee
複製後前http://stackoverflow.com/questions/1396527/any-reason-to-do-a-xor-eax-eax – mark4o
http://stackoverflow.com/questions/33666617/which-is-best-way-to-set-a-register-to-zero-in -x86-assembly-xor-mov-or-and(xor是最好的方法) –