问题标签 [gnu-assembler]

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 投票
2 回答
2324 浏览

c - GCC 不保存/恢复函数调用的保留寄存器

我在 GCC 中有一个场景导致我出现问题。我得到的行为不是我期望的行为。总结一下情况,我提出了几个在硬件模拟器中实现的 x86-64 新指令。为了测试这些指令,我使用现有的 C 源代码并使用十六进制对新指令进行手工编码。因为这些指令与现有的 x86-64 寄存器交互,所以我使用输入/输出/clobber 列表来声明 GCC 的依赖项。

发生的情况是,如果我调用一个函数,例如 printf,则不会保存和恢复相关寄存器。

例如

101 被分配给 r9 并且内联汇编(在这个例子中是假的)依赖于 r9。这在没有 printf 的情况下正确运行,但是当它存在时,GCC 不会保存和恢复 r9,并且在调用我的自定义指令时存在另一个值。

我想也许 GCC 可能已经秘密地改变了对变量r9 的赋值,但是当我这样做时

看看汇编输出,它确实在使用 %r9。

我正在使用 gcc 4.4.5。你认为可能会发生什么?我认为 GCC 将始终保存和恢复函数调用的寄存器。有什么办法可以强制执行吗?

谢谢!

编辑:顺便说一句,我正在编译这样的程序

0 投票
1 回答
1140 浏览

assembly - GAS:jmp to label会导致错误跳转?

我正在尝试组装以下程序:

通过这样做:“gcc -o test test.s main.c”,我得到了这个:

otool -v -t 测试

jmp 试图跳转到完全错误的地址 0x200000d14,而不是标有 go_out 标签的 0x100000d29。

请帮忙。

0 投票
1 回答
18418 浏览

x86 - x86 assembler: floating point compare

As part of a compiler project I have to write GNU assembler code for x86 to compare floating point values. I have tried to find resources on how to do this online and from what I understand it works like this:

Assuming the two values I want to compare are the only values on the floating point stack, then the fcomi instruction will compare the values and set the CPU-flags so that the je, jne, jl, ... instructions can be used.

I'm asking because this only works sometimes. For example:

will not print "Hallo" even though I think it should, and if you switch f1 and f2 it still won't which is a logical contradiction. je and jne however seem to work fine.

What am I doing wrong?

PS: does the fcomip pop only one value or does it pop both?

0 投票
2 回答
479 浏览

gcc - x86_64 "gcc -S" -> as -> ld -> 执行失败

我正在尝试在 x86_64 平台上通过“gcc -S”->“as”->“ld”编译一个简化的 C 源文件。

该过程没有错误完成,但在执行时,显示“没有这样的文件或目录”错误消息。

我还尝试添加一些谷歌结果中所述的动态链接。

但错误仍然存​​在。

意见和建议表示赞赏。

编辑:我犯了一个错误,我的 linux 机器中不存在 /lib64/ld-linux.so.2。我应该使用 /lib64/ld-2.9.so。不知道 ld 不报告指定不存在的库文件的错误。

0 投票
1 回答
1416 浏览

assembly - 在气体宏中自动生成 xmm 寄存器名称?

我想编写一个gas宏来生成包含各种movdqu指令的代码到xmm寄存器,具体取决于参数n。

编译后,反汇编代码是,

但是,当我在上面的 xxmov 宏中将 %xmm0 替换为 %xmm\n 时,出现编译错误,

那么,无论如何我可以将我的宏操作为 xmm 寄存器名称(从 %xmm0 到 %xmm_{n-1})?我已经尝试过http://sourceware.org/binutils/docs/as/Macro.html#Macro中提到的 \@ (%xmm\@) 。但是,它并没有很好地工作,因为我想多次使用这个宏,而 \@ 似乎是单调递增的。

0 投票
4 回答
22717 浏览

assembly - .byte 汇编指令在 gnu 汇编中有什么用?

在浏览一些具有内联汇编的 C 代码时,我遇到了 .byte (开头有一个点)指令。

在检查网络上的程序集参考时,我发现它用于在内存中保留一个字节。

但是在代码中,语句之前没有标签。因此,我想知道未标记的 .byte 指令或任何其他数据存储指令的用途是什么。

例如,如果我编码.byte 0x0a,我该如何使用它?

0 投票
1 回答
521 浏览

linux - help in understanding this code snippet

This is code snipper from header.S file in kernel code. I could not understand what the lretw instruction does. I've checked out so many online sources for the instruction.

Can any one help me in understanding this instruction?

0 投票
2 回答
2102 浏览

gcc - 用 GNU(GCC 和 GAS)替换 DOS 中的定时器中断处理程序

正如标题所暗示的,我正在尝试用我自己的一个替换 DOS 中的 Timer 中断的现有处理程序。在广泛搜索各种解决方案后,我发现了一些完全可以做到这一点的汇编代码,我什至设法编译和测试它,并看到它可以工作。

现在的问题是我找到的代码(见下文)是为 TASM 编写的,我希望将它与我正在编写的一些 C 代码一起使用,我用 GCC 编译这些代码。

我试图将代码转换为 GAS(GNU 汇编器)语法,但我似乎无法让它工作(在我多次尝试期间,我大多经历过一种或另一种崩溃)。

如果有人能用解决方案启发我,我将不胜感激(无论是 GAS 可以编译的汇编代码的工作版本,还是在 C 中完成整个事情的方法——“中断”关键字不起作用, “属性((中断))”等也没有——甚至是在 TASM 和 GCC 之间架起桥梁的一种方式)。

我还应该提到我正在使用的 DOS 系统实际上是一个 OracleVM VirtualBox 管理器,它运行一个安装了 FreeDOS 的虚拟机,而我用于 C 的编译器是 DJGPP 开发环境提供的 GCC .

这是我拥有的工作 TASM 代码(取自http://www.programmersheaven.com/mb/x86_asm/276128/276185/re-redefining-the-timer-interrupt-handler/):

它完全适用于我的机器。我启动程序,看到控制台的整个第一行都被不断变化的彩色字符所取代。

这是我将上述代码转换为 GAS 语法的尝试:

我使用以下命令编译我的文件(称为“ttv2.s”):

当我运行生成的 EXE 文件(在组装和链接过程中没有警告或错误)时,程序崩溃并出现错误“异常 0D in ring 0”(以及许多寄存器值)。但是,TASM 版本可以顺利运行!所以我猜我转换代码的方式或者我构建最终EXE的方式有问题。或两者。

一些额外的信息,如果它以任何方式有帮助:

  • 如果我删除安装命令 (the int $0x21),则不会发生崩溃,程序会等待我按下一个键然后退出。
  • 如果我保留安装命令,但删除等待键命令(int $0x16),程序立即退出,并且没有崩溃。
  • 如果我保留安装命令,并将wait-for-key 命令替换为活动延迟循环(一个简单的 40 亿次迭代循环),程序崩溃的方式与 wait-for-key 命令到位时相同,但几秒钟后,而不是立即。
  • 在崩溃的两种情况下(按键或延迟),即使我只删除了两个安装命令之一,程序也会崩溃。

在此先感谢您提供的任何和所有帮助,并为冗长的帖子感到抱歉...

0 投票
2 回答
25301 浏览

assembly - GAS:.cfi_def_cfa_offset 的解释

我想解释一下 GCC 生成的程序集中与 .cfi_def_cfa_offset 指令一起使用的值。我隐约知道 .cfi 指令涉及调用帧和堆栈展开,但我想更详细地解释一下为什么在编译以下 C 程序时 GCC 输出的程序集中使用值 16 和 8在我的 64 位 Ubuntu 机器上。

C程序:

我在源文件 test.c 上调用了 GCC,如下所示gcc -S -O3 test.c:我知道 -O3 启用非标准优化,但为了简洁起见,我想限制生成的程序集的大小。

生成的程序集:

为什么生成的程序集中的 .cfi_def_cfa_offset 指令使用值 16 和 8?另外,为什么数字 22 用于本地函数开始和函数结束标签?

0 投票
2 回答
367 浏览

linux - 检索气体中的命令行参数

我正在努力寻找一种方法来检索 GAS 中第一个命令行参数的第一个字符。为了澄清我的意思,我在 NASM 中是如何做到的:

编辑:文字转换为 AT&T 语法并在 GAS 中编译它不会产生预期的结果。EBX 值不会被识别为字符。