selph
selph
Published on 2021-12-31 / 367 Visits
0
0

《xchg rax,rax》片段分析0x01--Fibonacci序列

前言

今天是封宿舍的第3天,我打算将分析这个汇编片段的系列当成每日一更,本次内容比较简短,分析如下


实验环境:

  • Windows10 + VS2022 + masm

0x01

代码片段链接:xorpd | xchg rax,rax 0x01

.loop:
    xadd     rax,rdx
    loop     .loop

代码分析

xadd 指令

OpcodeInstructionOp/En64-Bit ModeCompat/Leg ModeDescription
0F C0 /rXADD r/m8, r8MRValidValidExchange r8 and r/m8; load sum into r/m8.
REX + 0F C0 /rXADD r/m8*, r8*MRValidN.E.Exchange r8 and r/m8; load sum into r/m8.
0F C1 /rXADD r/m16, r16MRValidValidExchange r16 and r/m16; load sum into r/m16.
0F C1 /rXADD r/m32, r32MRValidValidExchange r32 and r/m32; load sum into r/m32.
REX.W + 0F C1 /rXADD r/m64, r64MRValidN.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

参考资料

XADD — Exchange and Add (felixcloutier.com)


Comment