XOR寄存器,寄存器(汇编器)

发布于 2024-12-17 05:41:17 字数 190 浏览 1 评论 0原文

有时我们必须分析汇编代码(IA32), 我经常遇到这样的指令:

xor ax, ax

或与其他寄存器一起使用:xor dx, dx, xor al, al, ...

到底是什么这个做什么? (ax 异或 ax 总是给出 0 ?)

From time to time we have to analyze pieces of assembler code (IA32),
and more than often i come across an instruction that looks like this:

xor ax, ax

or with other registers aswell: xor dx, dx, xor al, al, ...

What exactly does this do ? (ax xor ax always gives 0 ?)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

客…行舟 2024-12-24 05:41:17

将寄存器设置为 0 是一种常见的汇编程序习惯用法。

xor ax, ax 对应于 ax = ax ^ ax,正如您已经注意到的,它实际上是 ax = 0 。

如果我没记错的话,主要优点是它的代码大小小于 mov ax, 0

It's a common assembler idiom to set a register to 0.

xor ax, ax corresponds to ax = ax ^ ax which, as you already noticed, is effectively ax = 0.

If I recall correctly the main advantage is that its code-size is smaller than mov ax, 0

浮光之海 2024-12-24 05:41:17

这正是它的作用——将寄存器的内容清零

That is exactly what it does -- zero the contents of a register

独木成林 2024-12-24 05:41:17

xor %ax, %ax,如前面的评论中所述,对应于 ax = ax xor ax。这实质上设置了 ax = 0。此外,它还会影响/修改一些 EFLAGS,例如 OF、CF、SF、PF 或 ZF。在这种情况下,将设置 PF 和 ZF 标志。

SF - 指示最后一次操作的结果是否产生最高有效位设置为 1 的值

。 PF - 指示最后一次操作结果的二进制表示形式中设置的位数是奇数还是偶数。

ZF - 如果数学/逻辑运算的结果为零则设置它,否则重置。

下面显示了使用 GDB 片段的示例。

指令:xor %ax,%ax

在“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

在“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

xor %ax, %ax, as stated in earlier comments corresponds to ax = ax xor ax. This essentially set ax = 0. In addition, it also affects/modifies some of the EFLAGS such as OF, CF, SF, PF or ZF. In this case, PF and ZF flags will be set.

SF - Indicates whether the result of the last operation resulted in a value whose most significant bit is set to 1.

PF - Indicates if the number of set bits is odd or even in the binary representation of the result of the last operation.

ZF - It is set if the result of the mathematical/logical operation is zero or reset otherwise.

Example is shown below using GDB snippets.

Instruction: xor %ax,%ax

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

After "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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文