问题标签 [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 回答
1291 浏览

assembly - 如何将字符串作为参数传递给内联汇编中的“调用”指令?

本质上,我希望能够做这样的事情:

基本上我想调用一个名称存储在字符串中的函数。这样做的正确语法是什么?

编辑:我们正在谈论 x86 程序集

0 投票
2 回答
1737 浏览

gcc - 在 GCC 风格的扩展内联汇编中,是否可以输出“虚拟化”布尔值,例如进位标志?

如果我有以下 C++ 代码来比较两个 128 位无符号整数和内联 amd-64 asm:

然后它将被非常有效地内联,但有一个缺陷。返回值是通过值为 0 或 1 的通用寄存器的“接口”完成的。这增加了两个或三个不必要的额外指令,并减损了本来可以完全优化的比较操作。生成的代码将如下所示:

如果我使用带有“int”返回值的“sbb %0,%0”而不是带有“bool”返回值的“setc %0”,还有两条额外的指令:

我想要的是这样的:

GCC 扩展的内联汇编很棒,否则。但我希望它在各个方面都与内在函数一样好。我希望能够以 CPU 标志或标志的状态形式直接返回布尔值,而不必将其“渲染”到通用寄存器中。

这是可能的,还是必须修改甚至重构 GCC(以及英特尔 C++ 编译器,它也允许使用这种形式的内联汇编)才能实现?

另外,当我在做的时候——还有其他方法可以改进我的比较运算符吗?

0 投票
3 回答
4719 浏览

x86 - 当我从内联汇编中调用 C++ 函数时,如何将参数传递给它们

所以,我希望能够从 c++ dll 调用函数。出于某些原因,我想从我的 C++ 代码中的 __asm 块中调用它们。我的问题是:我知道在调用函数之前,我必须按照函数调用约定指定的顺序将其参数推送到堆栈上。但是,我可以简单地做这样的事情吗:

让我担心的是,我似乎记得汇编中的标准字大小是 2 字节,而 C++ 中 int 的大小通常是 4 字节,而双精度则为 8 字节。所以,在上面的例子中,我真的是推送每个变量的完整值,还是仅推送前几个字节?如果上面的代码不正确,那么正确的方法是什么?另外,如果我们调用的函数返回一个双精度值,这个值存储在哪里?我假设它不能在寄存器中,因为它只能存储 32 位(4 字节)。对于这个混乱的任何帮助将不胜感激:)

0 投票
1 回答
1815 浏览

c - “错误:向后引用未知标签......”在 MinGW 内联汇编中

再一次,我使用 MinGW 内联汇编。

编译它:

C:\Users\Andre\Codes>gcc asmtest.c -o asmtest -masm=intel

哎呀,有错误:

C:\Users\Andre\AppData\Local\Temp\ccqny4yb.s:汇编程序消息:C:\Users\Andre\AppData\Local\Temp\ccqny4yb.s:53:错误:向后引用未知标签“110:”

这里有什么问题?我认为我的代码已经有效?

0 投票
1 回答
1998 浏览

gcc - '__asm__(".previous");' 是什么意思?意思是?

在尝试使用 mingw 4.4 编译我的项目时,它使用了一些第三方头文件,我遇到了以下错误:

汇编器消息:
错误:行尾有垃圾,第一个无法识别的字符是 '"'
错误:未知伪操作:'.previous'

我在包含的标题之一的末尾找到了这段代码:

由于我对内联汇编指令完全没有任何经验,所以我用谷歌搜索了它的解释,但找不到我的两个基本问题的答案。究竟做__asm__(".previous");了什么,为什么有人会把它放在头文件的末尾。

这些是__asm__整个项目中唯一的说明。我可以安全地删除它们吗?或者有没有办法定义 .previous 以使其成为已知的伪操作?

请赐教!

0 投票
6 回答
11081 浏览

c++ - 无需汇编的 C/C++ 函数定义

我一直认为printf(),在最后一步中,像这样的函数是使用内联汇编定义的。在 stdio.h 的深处隐藏着一些实际上告诉 CPU 做什么的 asm 代码。例如,在 dos 中,我记得它是通过首先mov将字符串的开头插入某个内存位置或寄存器然后调用intterupt 来实现的。

但是,由于 x64 版本的 Visual Studio 根本不支持内联汇编程序,这让我想知道 C/C++ 中怎么可能没有汇编程序定义的函数。如何printf()在不使用汇编代码的情况下在 C/C++ 中实现库函数?什么实际上执行了正确的软件中断?谢谢。

0 投票
2 回答
864 浏览

c - 在 GCC 中调用程序集?

有人能告诉我这段代码到底做了什么吗?我的意思是我有一个想法或这个命令的一部分。"1" newval 是输入,"=a" 是刷新它之前的值并更新它。“m”用于内存操作,但我对这个函数的功能感到困惑。“+m”符号有什么作用?此函数是否执行类似 m=a; 的操作?米=新瓦尔;返回一个

0 投票
3 回答
5887 浏览

c++ - 32 位到 64 位内联汇编移植

我有一段 C++ 代码(在 GNU/Linux 环境下用 g++ 编译)加载一个函数指针(它是如何做的并不重要),用一些内联汇编将一些参数推送到堆栈上,然后调用该函数,代码是这样的:

我想添加一些

但我不知道 64 位机器的内联汇编,任何人都可以帮助我吗?

谢谢

0 投票
3 回答
2346 浏览

c - 如何确定堆栈中保存的值?

我正在做一些实验,并希望能够在系统调用期间查看堆栈中保存的内容(用户登陆进程的保存状态)。根据http://lxr.linux.no/#linux+v2.6.30.1/arch/x86/kernel/entry_32.S它表明寄存器的各种值保存在堆栈指针的那些特定偏移量处。这是我一直试图用来检查堆栈中保存的内容的代码(这是在我创建的自定义系统调用中):

其中 value 是一个无符号长整数。

截至目前,该值不是预期的(它显示为 ds 的用户值保存了 0)。

我是否正确访问堆栈指针的偏移量?

另一种可能性可能是我可以在内核中使用诸如 GDB 之类的调试器来检查堆栈内容吗?我在调试方面没有太多广泛的用途,并且不确定如何调试内核中的代码。任何帮助深表感谢。

0 投票
7 回答
467 浏览

programming-languages - 有没有可以将编辑和编译/运行结合在一起的编程语言?

当我编码时,我总是写一些小块的单元,并经常编译它。这有助于我确保一切正常运行,但这非常耗时。是否有任何编程语言可以支持我们同时进行编码和运行?我的意思是只要按键导致有效代码,编辑的效果就会被合并到正在执行的程序中。