我有点自信我理解了XOR,它通常用于默认值为0,如果你比较两个相同的值,它会将其设置为0,如果它们不同,结果是1。
如果你有以下几点
位置
价值
%递交
0 xa
% rbx
0 x3
% rcx
0 x9
xorq %rcx,%rbx
那么下面的命令会做什么呢?我看不到xorq(只有xor)的任何文档,我知道所有这些x64寄存器是8字节,我猜我只是困惑,这个函数会做什么从我的回忆,我认为它会设置%rbx到一个新值?
###在AT&T语法中,大多数汇编代码指令都有一个单字符后缀来表示操作数的大小:
C声明
英特尔数据类型
汇编代码后缀
大小(字节)
字符
字节
短
词
int
双字
长
四字
char *
四字
浮动
单精度
双
双精度
一般来说,大小可以从寄存器的大小推断出来,但考虑下面的例子,将立即(常量)值移动到存储在EBX的地址的内存位置,你必须指导汇编程序的大小:
例如:
movb $2, (%ebx) /* Move 2 into the single byte at the address stored in EBX. */
movw $2, (%ebx) /* Move the 16-bit integer representation of 2 into the 2 bytes starting at the address in EBX. */
movl $2, (%ebx) /* Move the 32-bit integer representation of 2 into the 4 bytes starting at the address in EBX. */
所以你的例子只是按位异或(独占或)%rbx和%rcx寄存器,并将结果存储在%rbx (%rbx = %rbx ^ %rcx)。
在这种情况下,操作数的大小影响不大,但让我们看另一个例子,我们只将%rax的低阶字节归零:
测试中:
.global _start
.text
_start:
mov $-1, %rax
xorb $-1, %al
# exit(0)
mov $60, %rax
xor %rdi, %rdi
syscall
编译:
# gcc -nostdlib test.s
使用gdb会话检查:
# gdb -q ./a.out
Reading symbols from /root/a.out...(no debugging symbols found)...done.
(gdb) b _start
Breakpoint 1 at 0x4000d4
(gdb) run
Starting program: /root/./a.out
Breakpoint 1, 0x00000000004000d4 in _start ()
(gdb) disas
Dump of assembler code for function _start:
=> 0x00000000004000d4 <+0>: mov $0xffffffffffffffff,%rax
0x00000000004000db <+7>: xor $0xff,%al
0x00000000004000dd <+9>: mov $0x3c,%rax
0x00000000004000e4 <+16>: xor %rdi,%rdi
0x00000000004000e7 <+19>: syscall
End of assembler dump.
(gdb) info reg $rax $al
rax 0x0 0
al 0x0 0
(gdb) ni
0x00000000004000db in _start ()
(gdb) info reg $rax $al
rax 0xffffffffffffffff -1
al 0xff -1
(gdb) ni
0x00000000004000dd in _start ()
(gdb) info reg $rax $al
rax 0xffffffffffffff00 -256 <----- only the lower byte was xor'ed
al 0x0 0
引用:
x86程序集指南-操作后缀