前言
今天是封宿舍的第3天,我打算将分析这个汇编片段的系列当成每日一更,本次内容比较简短,分析如下
实验环境:
- Windows10 + VS2022 + masm
0x01
代码片段链接:xorpd | xchg rax,rax 0x01
.loop:
xadd rax,rdx
loop .loop
代码分析
xadd 指令
Opcode | Instruction | Op/En | 64-Bit Mode | Compat/Leg Mode | Description |
---|---|---|---|---|---|
0F C0 /r | XADD r/m8, r8 | MR | Valid | Valid | Exchange r8 and r/m8; load sum into r/m8. |
REX + 0F C0 /r | XADD r/m8*, r8* | MR | Valid | N.E. | Exchange r8 and r/m8; load sum into r/m8. |
0F C1 /r | XADD r/m16, r16 | MR | Valid | Valid | Exchange r16 and r/m16; load sum into r/m16. |
0F C1 /r | XADD r/m32, r32 | MR | Valid | Valid | Exchange r32 and r/m32; load sum into r/m32. |
REX.W + 0F C1 /r | XADD r/m64, r64 | MR | Valid | N.E. | Exchange r64 and r/m64; load sum into r/m64. |
指令:xadd 目的寄存器, 源寄存器
,功能是交换两个寄存器的值,然后把sum赋值给目的寄存器:
TEMP ← SRC + DEST;
SRC ← DEST;
DEST ← TEMP;
代码片段分析
使用loop循环执行xadd指令假如输入都是1,则rax和rdx的值的变化则依次是:
初始:rax = 1, rdx = 1
执行1次:rax = 2, rdx = 1
执行2次:rax = 3, rdx = 2
执行3次:rax = 5, rdx = 3
执行4次:rax = 8, rdx = 5
执行5次:rax = D, rdx = 8
不难发现这个数值变化的规律:1 1 2 3 5 8 D
,这是Fibonacci序列的计算
本片段内容作者想表达的应该是使用汇编xadd指令实现数学中Fibonacci序列的计算(作者在简介里提到的这本书的内容是关于汇编、数学和生活的,这一节就是数学的内容了),本节主要学到了xadd指令的基本使用
完整测试代码:
.code
main proc
;rax = 0
;rdx = 1
;rcx = 7
xor rax, rax
xor rdx, rdx
inc rax
inc rdx
push 7
pop rcx
looptag:
xadd rax,rdx
loop looptag
ret
main ENDP
END