2011-11-20 13 views
6

Od czasu do czasu mamy do analizy fragmentów kodu asemblera (IA32) i więcej niż często spotykam instrukcji, która wygląda tak:XOR rejestr, rejestr (assembler)

xor ax, ax 

lub inne rejestry również: xor dx, dx, xor al, al, ...

Co dokładnie to robi? (Ax xor ax zawsze daje 0?)

+0

duplikat 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 jest najlepszym sposobem) –

Odpowiedz

13

To powszechny assembler idiom ustawić rejestr 0.

xor ax, ax odpowiada ax = ax^ax które, jak już was ogłoszeń, jest skutecznie ax = 0.

Jeśli dobrze pamiętam główną zaletą jest to, że jego kod, rozmiar jest mniejszy niż mov ax, 0

+0

Dzięki, ja im musiało to być coś innego niż ustawienie na 0, ponieważ używałbym 'mov ax, 0' do tego, ale jeśli tworzy krótszy kod, to ma to sens. – Aerus

2

To jest dokładnie to, co robi - wyzerować zawartość rejestru

1

xor ax%,% ax, jak podano we wcześniejszych komentarzach odpowiada ax = ax ax lub ax. Ten zasadniczo ustawiony ax = 0. Ponadto wpływa on/modyfikuje niektóre EFLAGS, takie jak OF, CF, SF, PF lub ZF. W takim przypadku zostaną ustawione flagi PF i ZF.

SF - Wskazuje, czy wynik ostatniej operacji spowodowało wartość, której najbardziej znaczący bit jest ustawiony na 1.

PF - Wskazuje, czy liczba ustawionych bitów jest parzysta czy nawet w binarnym przedstawieniem wynik ostatniej operacji.

ZF - Ustawiana, jeśli wynik operacji matematycznej/logicznej jest zerowy lub w przeciwnym razie resetowany.

Przykład pokazano poniżej za pomocą fragmentów GDB.

instrukcji: XOR% ax,% AX

Przed "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 

po "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

Witamy w SO. Ta odpowiedź jest bardziej szczegółowa, niż jest przydatna, IMO. Nie musisz wyjaśniać, jak działają wszystkie flagi w odpowiedzi na pytanie o idiom zerowania. Wystarczy zostawić komentarz wskazujący, że w przeciwieństwie do 'mov reg, 0', xor wpływa na flagi. Ponieważ twoja odpowiedź spowodowała pojawienie się tego pytania na stronie głównej ostatniej aktywności, zostawiłem komentarz do pytania z linkiem do bardziej szczegółowej odpowiedzi na pytanie, dlaczego xor jest najlepszym sposobem na zerowanie regów. (Gdzie wspomniałem, że w większości przypadków, zerowanie przed instrukcją, której wyniki flag chcesz.) –

+0

Dzięki .. Zgadzam się, że ma więcej szczegółów niż potrzeba. Zauważyłem to teraz. – scanjee

Powiązane problemy