问题标签 [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 投票
5 回答
94345 浏览

c - 有没有办法将汇编代码插入C?

我记得在过去使用旧的 bo​​rland DOS 编译器时,您可以执行以下操作:

现在有半平台独立的方式来做到这一点吗?我需要进行 BIOS 调用,所以如果有办法在没有 asm 代码的情况下做到这一点,那对我同样有用。

0 投票
5 回答
6698 浏览

assembly - GCC 内联汇编器,混合寄存器大小 (x86)

有谁知道我怎样才能摆脱以下汇编程序警告?

代码是 x86,32 位:

如果我编译它,我会收到以下(非常有效的)警告:

我正在寻找的是一种告诉编译器/汇编器我想要访问 %0 的低 16 位子寄存器的方法。访问字节子寄存器(在本例中为 AL 和 AH)也很高兴知道。

我已经选择了“q”修饰符,所以编译器被迫使用 EAX、EBX、ECX 或 EDX。我已经确保编译器必须选择一个具有子寄存器的寄存器。

我知道我可以强制 asm 代码使用特定的寄存器(及其子寄存器),但我想将寄存器分配工作留给编译器。

0 投票
4 回答
4771 浏览

c - 如何在 Turbo C 的 C 代码中包含汇编代码?

如何在我的 C 程序中包含任何汇编代码行?

在 turbo c 中是否有可能将汇编代码文件 (.asm) 添加到少数 .c 文件的项目中?

0 投票
5 回答
13617 浏览

iphone - 如何在 iPhone 上进行内联汇编?

它是如何完成的?我需要采取哪些步骤以及需要考虑哪些陷阱和陷阱?

0 投票
2 回答
8237 浏览

c - 如何在 GCC x86 内联汇编中使用地址常量

GCC 工具链默认使用 AT&T 汇编器语法,但可以通过.intel_syntax指令获得对 Intel 语法的支持。

此外,AT&T 和 Intel 语法在 aprefix和 anoprefix版本中都可用,它们的不同之处在于它们是否需要在寄存器名称前加上%sigil。

根据存在的指令,地址常量的格式会发生变化。

让我们考虑以下 C 代码

使用objdump -d,我们发现它被编译成下面的汇编指令

由于不涉及任何寄存器,因此这是 and 的正确语法.att_syntax prefix.att_syntax noprefix即。嵌入在 C 代码中,它们看起来像这样

您可以选择用括号括住地址常量,即。

也会起作用。

将印记添加到普通地址常量时,代码将无法复制

当用括号括起来这个表达式时,编译器将发出错误代码而不发出警告,即

这将错误地发出指令

在 Intel 模式下,地址常量必须以段寄存器以及操作数大小和PTR标志为前缀(如果可能存在歧义)。在我的机器上(一台装有 Windows XP 和当前 MinGW 和 Cygwin GCC 版本的英特尔双核笔记本电脑),ds默认使用该寄存器。

常量周围的方括号是可选的。如果段寄存器被省略,但括号存在,地址常数也能被正确识别。不过,省略寄存器会在我的系统上发出警告。

prefix模式下,段寄存器必须以 为前缀%,但仅使用括号仍然有效。这些是生成正确指令的不同方法:

省略段寄存器和括号将无法编译

我会将此问题标记为社区 wiki,因此如果您有任何有用的内容要添加,请随时添加。

0 投票
11 回答
11465 浏览

c - Alloca 实施

如何在 D、C 和 C++ 等语言中使用内联 x86 汇编器实现 alloca()?我想创建一个稍微修改过的版本,但首先我需要知道标准版本是如何实现的。从编译器读取反汇编并没有帮助,因为它们执行了很多优化,我只想要规范形式。

编辑:我想困难的部分是我希望它具有正常的函数调用语法,即使用裸函数或其他东西,使其看起来像正常的 alloca()。

编辑#2:啊,到底是什么,你可以假设我们没有省略帧指针。

0 投票
2 回答
13784 浏览

c - GCC内联汇编:跳转到块外的标签

在 MSVC 下使用内联汇编时,可以通过引用 C/C++ 代码中的标签来跳出汇编块,如MSDN 文章中所述

在 GCC 下使用内联汇编时可以这样做吗?

这是我要完成的示例:

然而,编译器抱怨没有定义“external_label”。

0 投票
3 回答
11218 浏览

c - C 中的 ASM 使用 -std=c99 给出错误

我现在愿意编译我的项目,-std=c99但我遇到了一个我暂时不理解的错误。这一行:

仅在 C99 中给我以下错误:

欢迎任何线索帮助我理解这意味着什么。这行不是我写的,我也不确定它的目的是什么。

0 投票
4 回答
11921 浏览

gcc - 64 位整数的 cmpxchg 示例

我在 i686 架构中使用 cmpxchg(比较和交换)进行 32 位比较和交换,如下所示。

(编者注:最初的 32 位示例有问题,但问题不在于它。我相信这个版本是安全的,并且作为奖励,它也可以为 x86-64 正确编译。 另请注意,内联 asm 不是为此需要或推荐;或在 i486 和 x86-64 上或上__atomic_compare_exchange_n的较旧__sync_bool_compare_and_swap工作int32_tint64_t。但这个问题是关于使用内联汇编来完成的,以防万一。)


64 位比较和交换的 x86_64 架构的等效项是什么

0 投票
3 回答
360 浏览

c - 在 C 中嵌入程序集,编译器为您查找寄存器

将汇编代码嵌入到 C/C++ 程序中时,您可以通过使用 push 指令保存寄存器来避免破坏寄存器(或指定编译器支持它的 clobber 列表)。

如果您包含汇编内联并希望避免推送和弹出破坏寄存器的开销,有没有办法让 gcc 为您选择寄存器(例如,它知道其中没有有用信息的寄存器)。