问题标签 [yasm]

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 投票
1 回答
204 浏览

assembly - yasm:预期的“,”,具有直接价值

给定以下汇编程序:

Yasm 输出:

为什么这里需要逗号?NASM 很高兴地组装了它。

0 投票
0 回答
258 浏览

undefined - YASM,为什么全局外部链接不起作用

我是使用 ebe 编辑器组装和使用 yasm 的新手。

现在,在第一步之后,我想检查全局/外部机制。

因此我做了2个模块:

演员.asm

迎宾员.asm

这两个文件都已编译,当我运行第一个文件时,会出现以下错误消息:

/home/1/Öffentlich/EBE_Space/ext_glob_test/actor.o:在函数 main': /home/1/Öffentlich/EBE_Space/ext_glob_test/actor.asm:6: undefined reference togreeter'

怎么了?使全局函数可链接的必要条件是什么?

TIA

0 投票
1 回答
96 浏览

assembly - NASM/Yasm 在评论以反斜杠结尾后放弃 CALL

我目前正在尝试构建自己的引导加载程序,并注意到一些奇怪的东西。

当下面的代码用 NASM 或 Yasm 组装而没有标记的 NOP 命令时,二进制文件中缺少以下 CALL。在包含 NOP 的情况下,CALL 已正确组装,但二进制文件中不存在操作码 0x90 (NOP)(由于 NOP 的性质,稍后可以理解)。

0 投票
1 回答
249 浏览

assembly - Gnu 汇编器给出了意外的内存操作数

GNU 汇编器在汇编 Intel 语法代码时给出了意外的内存操作数。

我已将我的错误减少为一行代码,在过去的三天里,我尝试了任何方法来理解为什么 GNU 汇编器会产生一些我无法理解的东西。我知道这必须(或应该)是微不足道的,但我不知所措。

以下文本位于文件 code.asm 中:

组装和反汇编 code.asm:

code1.asm(带有反汇编代码)的内容是:

我正在使用 GNU 汇编器 (GNU Binutils) 2.25 (`x86_64-pc-cygwin')。

问题:为什么内存操作数 QWORD PTR [rcx+0x8] 中多了一个 qword 偏移量(8bytes)?我期待 mov rax,QWORD PTR [rcx]。

我一定做错了什么。所以我与另一个受人尊敬的汇编程序 Yasm 进行了交叉检查并运行:

code2.asm 的内容是:

关于内存操作数,这是我所期望的。我如何指示 GNU 做同样的事情?

0 投票
1 回答
426 浏览

assembly - Yasm 和 MSVC 2013 链接器:Win64 上的 RIP

我正在阅读“Linux 的 64 位英特尔汇编语言编程简介”并出于学习原因使用 Yasm 和 MS Visual Studio 2013 将代码移植到 Windows。在第 7 章,有一个 switch 的例子:

我从链接器得到:

但是,我试图弄清楚发生了什么,并且我知道这是 x64 架构上的一些解决问题。所以我将代码更改为:

并且代码有效。但是,我有一个问题:这段代码应该可以在使用 gcc 或 ld 作为链接器的 Linux 上运行。为什么我需要修改代码?

0 投票
1 回答
221 浏览

assembly - NASM 内置 __BITS__ 宏的 YASM 等效项?

我有一段 nasm 汇编代码,我希望它与 yasm 兼容,但在其上运行汇编程序会在几个 nasm 特定的宏和包括错误,主要与条件有关

__BITS__当前位模式在哪里。

YASM 是否具有等效的功能,或者根据位模式遵循代码路径的任何其他方式?

0 投票
0 回答
166 浏览

assembly - 如何减少 x86 汇编程序编译单个 200MB+ 文件的内存使用量?

我正在尝试在具有 4GB RAM 的 VM 中使用 GAS 组装 >200MB x86 asm 文件。不幸的是,GAS 很快消耗了所有系统内存并被杀死。我也尝试过使用该--reduce-memory-overheads标志,但出现相同的结果。

我也尝试过使用 yasm,但它也内存不足。

我知道汇编程序并不是真正设计用于处理这种大小的文件,但我也很惊讶他们使用这么多内存来尝试这样做(为什么会这样?)。

实际代码只是一个大函数,分成几个部分,所以理论上可以分解成单独的函数(或者它们需要是单独的文件吗?),但是有没有办法在不拆分函数的情况下组装它?我也可以分配更多的 RAM,但我怀疑这对我可用的 RAM 量没有多大帮助(我认为 4GB 就足够了)。

0 投票
2 回答
797 浏览

assembly - 汇编中时序主循环中代码对齐的影响

假设我有以下主循环

我计时的方法是将它放在另一个像这样的长循环中

我发现我选择的对齐方式会对时间产生重大影响(高达 +-10%)。我不清楚如何选择代码对齐方式。我可以想到三个地方我可能想要对齐代码

  1. 在函数的入口处(参见triad_fma_asm_repeat下面的代码)
  2. 在重复我的主循环的外循环(.L1上面)的开始处
  3. 在我的主循环开始时(.L2上面)。

我发现的另一件事是,如果我在源文件中放入另一个例程,那么即使它们是独立的函数,更改一条指令(例如删除一条指令)也会对下一个函数的时序产生重大影响。过去我什至看到这会影响另一个目标文件中的例程。

我已阅读Agner Fog 的优化组装手册中的第 11.5 节“代码对齐”,但我仍然不清楚对齐代码以测试性能的最佳方法。他举了一个例子,11.5,计时一个我没有真正遵循的内循环。

目前从我的代码中获得最高性能的是猜测不同值和对齐位置的游戏。

我想知道是否有一种智能的方法来选择对齐方式?我应该对齐内环和外环吗?只是内循环?函数的入口也是?使用短 NOP 还是长 NOP 重要吗?

我最感兴趣的是 Haswell,其次是 SNB/IVB,然后是 Core2。


我已经尝试过 NASM 和 YASM 并且发现这是它们显着不同的一个领域。NASM 只插入一字节 NOP 指令,而 YASM 插入多字节 NOP。例如,通过将上面的内部和外部循环都对齐到 32 字节 NASM 插入了 20 个 NOP (0x90) 指令,其中 YASM 插入了以下指令(来自 objdump)

到目前为止,我还没有观察到性能上有显着差异。看来,对齐与指令长度无关。但是 Agner 在对齐代码部分写道:

使用更长的指令比使用大量单字节 NOP 更有效。


如果您想玩对齐并在下面自己查看效果,您可以找到我使用的程序集和 C 代码。替换double frequency = 3.6为您的 CPU 的有效频率。您可能想要禁用涡轮。

这是我用来调用汇编例程并为它们计时的 C 代码


我对NASM 手册中的以下语句感到困扰

最后一个警告: ALIGN 和 ALIGNB 相对于节的开头起作用,而不是最终可执行文件中地址空间的开头。例如,当您所在的部分只能保证与 4 字节边界对齐时,对齐到 16 字节边界是浪费精力。同样,NASM 不会检查该部分的对齐特性是否适合使用 ALIGN 或 ALIGNB。

我不确定代码段是获得一个绝对的 32 字节对齐地址还是只有一个相对地址。

0 投票
0 回答
126 浏览

assembly - yasm 常量和 sys 代码 / ld 文件无法识别:文件格式无法识别

作为序言,我正在当地大学学习系统编程。我们在 vBox 上使用 Ubuntu 来组装 yasm 并运行我们的程序。我有正常运行的代码,但我相信 vm 开销会导致时序执行问题。我们正在开发一个线程程序。

我想在我的本机 win7 安装上组装和运行该程序,但出现链接错误。我在 Windows 上使用的命令是:

它组装了,但是当我链接时,我得到了hw12.obj: file not recognized: File format not recognized

以下是版本信息:

一个相关的问题,我不知道它是否会解决问题(我假设不会):

我目前将常量和系统调用代码硬编码在section .data. 这是供参考的代码:

我的教授提到有一个文件已经包含所有这些,可以包含但没有提及如何包含。我一直无法找到如何做这样的事情,并且也想知道 win 的等价物,以免不得不查找 syscodes。aka 我会简单地更改包含以便在 Windows 上组装。

0 投票
0 回答
325 浏览

assembly - yasm 中的分段错误(核心转储)

我是汇编编程的新手。我写了你看到的代码,这意味着在汇编中是冒泡排序的。但是当我用山药编译它时,我得到了错误“分段错误(核心转储)”。顺便说一句,我正在运行我的程序

在 ubuntu 系统上。首先感谢您的帮助,我确实重写了我的程序。但我仍然遇到同样的错误。多亏了 gdb,我现在知道这是数组的堆栈溢出。但我不知道如何解决它。如果我注释掉下面的 2 行,它工作正常:

现在这里是其余的一起。