gpt4 book ai didi

c - 帮助理解 x86 内联汇编中的 DIV 指令

转载 作者:太空狗 更新时间:2023-10-29 15:04:58 28 4
gpt4 key购买 nike

在阅读 GNU 项目中的一些源代码时,我遇到了这段内联汇编:

__asm__ (
"divq %4"
: "=a" (q), "=d" (r)
: "0" (n0), "1" (n1), "rm" (d)
);

这里有变量q, r, n0, n1, and d 是 64 位整数。我知道足够多的汇编来了解其作用的要点,但有一些我不确定的细节。

我的理解:

我们将 RAX 寄存器的内容除以 d,将商放在 q 中,将余数放在 r 中。

我不明白的地方

  1. 为什么有三个输入这里?我们只需要输入一个股息和除数,那有什么用可以有 3 个输入吗?
  2. 我分不清哪个输入是红利。更一般地说,我实际上没有看到任何东西被加载到 RAX 寄存器中,那么它怎么知道什么除以什么?

最佳答案

在输入操作数规范中:

: "0" (n0), "1" (n1), "rm" (d)

由于输出规范,寄存器“0”和“1”被强制为 raxrdx:

: "=a" (q), "=d" (r)

div 指令族需要 RDX:RAX 中的分子。除数可以在通用寄存器(不以其他方式使用 - 即,不是 RAXRDX)或内存中,由“rm”约束指定。寄存器RDXRAX和除数操作数组成了3个输入。

所以这将最终执行除法:n1:n0/d 其中 n1:n0 是加载到 rdx:rax 中的数量.

关于c - 帮助理解 x86 内联汇编中的 DIV 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4541089/

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