gpt4 book ai didi

汇编:在 ADC 循环中增加 2(或更大的数字)而不破坏 CF?

转载 作者:行者123 更新时间:2023-12-02 14:41:54 24 4
gpt4 key购买 nike

我正在尝试在 Windows 中的 TDM-GCC 64 位程序集中测试加法函数。我不久前搜索了这方面的资源,发现了与此类似的代码(我做了一些更改以在 TDM-GCC 中编译它)。

typedef struct
{
int size;
__uint64_t uints[130];
} BigInteger;

void add(BigInteger *X, BigInteger *Y); // X += Y
// %rcx holds address of X, and %rdx holds address of Y apparently.

// calc.s - assembly file
.globl add
add:
movq 8(%rdx), %rax
addq %rax, 8(%rcx)
movq 16(%rdx), %rax
adcq %rax, 16(%rcx)
movq 24(%rdx), %rax
adcq %rax, 24(%rcx)
... ...

第一个汇编代码有效。缺点是即使对于很小的数字,计算最大尺寸也只需要很长的时间。因此,我让它检查 X 和 Y 的大小,并放置一个具有大小条件的循环,这样如果 X 和 Y 不大,它就不必总是添加整个数组。

    ...
// %r13 holds X addr, %r14 holds Y addr.
addq $8, %r13 // I have tried incq %r13
addq $8, %r14 // I have tried incq %r14
movq (%r14), %rax
addq %rax, (%r13)
decl %ecx
cmpl $0, %ecx
je .add4
.add3:
addq $8, %r13 // I have tried incq %r13
addq $8, %r14 // I have tried incq %r14
movq (%r14), %rax
adcq %rax, (%r13)
loop .add3
.add4:
...

但我太简单了,认为使用 ADDQ 运算符将 8 个字节添加到 X 和 Y 的地址(%r13, %r14) 就可以遍历数组。这里的问题是,如果我像这样使用 ADDQ 运算符,它会将进位标志重置为 0,因此使用进位 (.add3) 计算加法的整个循环会崩溃。我尝试使用

    incq %r13

认为 incq 的工作方式与 C++ 中的指针递增类似,它知道应该移动多少字节。但这只会将寄存器值增加 1,而不是我认为会移动的 8。


所以我的问题是:在汇编中是否有一种方法可以将寄存器增加大于 1 的数字,或者在根本不触及进位标志的情况下进行加法? (不是add,adc因为他们都在最后设置了进位标志)

最佳答案

使用寄存器+偏移量加载有效地址

        lea     rax,[rax+8]    ;add 8 to rax

关于汇编:在 ADC 循环中增加 2(或更大的数字)而不破坏 CF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52816099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com