x86 fbstp指令的C内联汇编

发布于 2024-09-05 06:22:00 字数 460 浏览 5 评论 0原文

想知道如何在 32 位 I86 架构上内联 fbstp 的使用。我尝试过类似的方法,

int main( )
{
    double foo = 100.0;

    long bar = 0;

    asm( "pushl %1; fbstp %0"
         : "=m"(bar)
         : "r"(foo)
       );

    ...

但是 bar 没有改变。我已经尝试阅读我能找到的所有内容,但大多数示例只是简单地执行诸如将两个整数相加之类的操作。我找不到任何关于将操作数压入堆栈的内容,以及当像 fbstp 这样的指令将 80 位数据写回内存时我应该做什么(即使用什么 C 类型)以及如何在 asm 语法中指定它的内容。 。

同样在 x86-64 上,似乎有一个 Pushq 而没有 Pushl,但 fbstp 仍然存在,而 fbstq 不存在。 64 位还有其他魔法吗?

Was wondering how to inline a usage of fbstp on a 32 bit I86 architecture. I tried something like

int main( )
{
    double foo = 100.0;

    long bar = 0;

    asm( "pushl %1; fbstp %0"
         : "=m"(bar)
         : "r"(foo)
       );

    ...

But bar is unchanged. I have tried reading everything I can find on this but most example simply do things like add two integers together. I can’t find any that talk about pushing operands onto the stack and what I should be doing when an instruction like fbstp writes 80 bits of data back to memory ( i.e. what C type to use ) and how to specify it in the asm syntax.

Also on x86-64 there seems to be a pushq and no pushl but fbstp still exists whereas fbstq does not. Is there some other magic for 64 bit.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

倾城°AllureLove 2024-09-12 06:22:00

这里有一个例子: http://bap .ece.cmu.edu/download/bap-0.1/VEX/test/test-i386.c

这似乎建议这样做:

unsigned short bcd[5];
double a;

asm("fbstp %0" : "=m" (bcd[0]) : "t" (a) : "st");

There's an example here: http://bap.ece.cmu.edu/download/bap-0.1/VEX/test/test-i386.c

which seems to suggest doing something like this:

unsigned short bcd[5];
double a;

asm("fbstp %0" : "=m" (bcd[0]) : "t" (a) : "st");
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文