问题标签 [inline-assembly]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
6114 浏览

c - 来自 GCC 内联汇编的系统调用

是否可以使用内联汇编块中的系统调用编写单个字符?如果是这样,如何?它应该看起来像这样的“东西”:

80 美元是 ascii 中的“P”,但没有返回任何内容。

任何建议非常感谢!

0 投票
5 回答
1929 浏览

c++ - 装配/SSE 乘法帮助

我一直试图弄清楚如何在非常关键的几行代码中获得一些改进:

所有 a, b, c ... 都是浮点数。

我决定考虑使用 SSE,但似乎找不到任何改进,事实上它的速度是原来的两倍。我的 SSE 代码是:

我也尝试使用标准的内联汇编,但似乎我不能像使用 SSE 那样将寄存器与四个浮点打包在一起。

任何评论或帮助将不胜感激,我主要需要了解为什么我使用 SSE 的计算比串行 C++ 代码慢?

我在 Windows XP 上的 Visual Studio 2005 中编译,使用带有 HT 的 Pentium 4,如果这提供了任何额外的信息。

提前致谢!

0 投票
2 回答
4741 浏览

visual-studio - 内联汇编程序获取指针 Visual Studio 的地址

我在 VS 中有一个函数,我将一个指针传递给该函数。然后我想将指针存储在寄存器中以进一步操作。你是怎样做的?

我试过了

0 投票
7 回答
22424 浏览

c - 是否可以在 C 中访问 32 位寄存器?

是否可以在 C 中访问 32 位寄存器?如果是,如何?如果没有,那么有没有办法在 C 中嵌入汇编代码?顺便说一句,我正在使用 MinGW 编译器。提前致谢!

0 投票
3 回答
1658 浏览

assembly - 从 Pascal 执行汇编

如何从 Pascal 执行此代码:

我在函数(variable1,variable2)中定义方法/函数参数的地方。

这是一项学校作业,我不知道他们为什么让我们做 Pascal/Assembly 而不是 Java/C++ 之类的。

这不是我在需要帮助之前做了大量工作的全部任务,感谢任何帮助谢谢

0 投票
1 回答
839 浏览

gcc - x86 fbstp指令的C内联汇编

想知道如何在 32 位 I86 架构上内联 fbstp 的使用。我尝试了类似的东西

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

同样在 x86-64 上似乎有 pushq 而没有 pushl 但 fbstp 仍然存在而 fbstq 不存在。64位还有其他魔力吗?

0 投票
2 回答
1715 浏览

c - 64 位问题:尝试使用内联汇编将值从 %rsp 复制到临时变量中

我正在参加一个操作系统设计课程,其中他们为我们提供了一个用 C 语言编写的微内核,我们在此基础上进行构建。内核似乎是为 32 位机器设计的,我正在运行雪豹。因此,我和班上的一位朋友一直在尝试将其破解为 64 位寻址。

最大的问题似乎是一行代码,其中内联汇编用于将当前堆栈指针复制到调度程序使用的临时变量中:

自然,编译器会向我吐回错误,因为%esp它是一个 32 位寄存器。

所以我用它替换它,%rsp因为它是 64 位堆栈指针寄存器(我认为也%sp可以,我在这里的其他地方读到 GAS 足够聪明,可以放置正确的前缀)。替换为 后%esp%rsp我收到此错误:

现在,我有点不知所措,因为我对汇编程序并没有真正的经验。我尝试用movl,mov和替换movq,但似乎没有任何效果。这让我相信也许temp是错误的尺寸?

Temp 是一个全局变量,声明如下:

我写了一个快速程序来打印不同数据类型的大小,看起来 x86-64 中的 void* 大小为 8 个字节,应该是正确的大小,对吧?

无论如何,显然我不希望有人为我解决这个问题,但是任何可能为我指明正确方向的提示将不胜感激!

0 投票
2 回答
934 浏览

x86 - 如何将所有 1 加载到 mmx 寄存器中?为什么这不起作用?

当我搜索时,除了关于 64/32 位内容的意见问题外,似乎找不到任何东西。

根据我的 xcode 调试器(这是 C++ 中的内联 asm),在这 2 条指令之后,mm2 寄存器保存值 0x30500004ffffffff。现在我是 x86 程序集的新手,我的程序集课程是在我很久以前学习的 MIPS 中教授的,但我想这不起作用,因为我正在以 32 位模式和 rbx 编译(这是 photoshop 插件的一部分)( ebx、bx 等的 64 位版本,对吗?)在技术上可能不存在。我尝试了其他方法来获得所有 1,例如将 0xfffffffful 加载到 mm2 和另一个寄存器并进行乘法,但这似乎也不起作用。

我正在修复使用一些 SIMD 指令优化我的插件,但我似乎无法弄清楚或找到任何不会让我眼睛受伤的文档。任何帮助深表感谢!

0 投票
2 回答
2534 浏览

gcc - 我的第一个汇编程序出错(GCC 内联汇编)

经过大量互联网研究后,我在我的 C++ 程序中实现了一个小型汇编程序,以使用 cpuid 获取 CPU 的 L1 缓存大小。

它在带有 MinGW(GCC,G++)的 Windows 7 64 位上完美运行。接下来,我在使用 GCC 4.0 的 Mac 计算机上尝试了此操作,但一定有错误,因为我的程序在 ComboBoxes 中显示奇怪的字符串,并且无法连接某些信号(Qt GUI)。

这是我的第一个汇编程序,希望有人能给我提示,谢谢!

0 投票
7 回答
2573 浏览

c++ - 最快的 64 位阶乘实现导致汇编

这不是家庭作业,只是我想到的。因此,直接计算阶乘并不是很快;记忆化会有所帮助,但如果结果适合 32 位或 64 位,则阶乘只能分别用于输入0和。所以......我们不妨使用查找表:1220

所以,假设我想要一个使用内联汇编的内联 C++ 阶乘函数,结果是 32 位或 64 位无符号整数。如果输入为负数或大到足以导致溢出,则输出应为 0。如何在汇编中做到这一点,以便消耗最少的周期?此代码将在 64 位 Intel/AMD 架构上运行。如果可行,我有兴趣改善最坏的情况,因此20!计算时间不应该比0!- 希望有一种二进制搜索方法。希望有一个聪明的技巧来做if (n == 0 || n == 1) { return 1; }。另外,如果输出需要是 32 位的,那么我认为汇编指令可以同时包含代码和数据。我的组装知识很薄弱。如果这个问题没有多大意义,请告诉我。

能够在 C++ 中使用该函数会很好 - 使它成为一个更现实的问题。例如,如果调用一个函数很昂贵,那么尝试在程序集主体中节省 1-2 个时钟周期将无济于事。