问题标签 [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.
assembly - yasm:预期的“,”,具有直接价值
给定以下汇编程序:
Yasm 输出:
为什么这里需要逗号?NASM 很高兴地组装了它。
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 to
greeter'
怎么了?使全局函数可链接的必要条件是什么?
TIA
assembly - NASM/Yasm 在评论以反斜杠结尾后放弃 CALL
我目前正在尝试构建自己的引导加载程序,并注意到一些奇怪的东西。
当下面的代码用 NASM 或 Yasm 组装而没有标记的 NOP 命令时,二进制文件中缺少以下 CALL。在包含 NOP 的情况下,CALL 已正确组装,但二进制文件中不存在操作码 0x90 (NOP)(由于 NOP 的性质,稍后可以理解)。
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 做同样的事情?
assembly - Yasm 和 MSVC 2013 链接器:Win64 上的 RIP
我正在阅读“Linux 的 64 位英特尔汇编语言编程简介”并出于学习原因使用 Yasm 和 MS Visual Studio 2013 将代码移植到 Windows。在第 7 章,有一个 switch 的例子:
我从链接器得到:
但是,我试图弄清楚发生了什么,并且我知道这是 x64 架构上的一些解决问题。所以我将代码更改为:
并且代码有效。但是,我有一个问题:这段代码应该可以在使用 gcc 或 ld 作为链接器的 Linux 上运行。为什么我需要修改代码?
assembly - NASM 内置 __BITS__ 宏的 YASM 等效项?
我有一段 nasm 汇编代码,我希望它与 yasm 兼容,但在其上运行汇编程序会在几个 nasm 特定的宏和包括错误,主要与条件有关
__BITS__
当前位模式在哪里。
YASM 是否具有等效的功能,或者根据位模式遵循代码路径的任何其他方式?
assembly - 如何减少 x86 汇编程序编译单个 200MB+ 文件的内存使用量?
我正在尝试在具有 4GB RAM 的 VM 中使用 GAS 组装 >200MB x86 asm 文件。不幸的是,GAS 很快消耗了所有系统内存并被杀死。我也尝试过使用该--reduce-memory-overheads
标志,但出现相同的结果。
我也尝试过使用 yasm,但它也内存不足。
我知道汇编程序并不是真正设计用于处理这种大小的文件,但我也很惊讶他们使用这么多内存来尝试这样做(为什么会这样?)。
实际代码只是一个大函数,分成几个部分,所以理论上可以分解成单独的函数(或者它们需要是单独的文件吗?),但是有没有办法在不拆分函数的情况下组装它?我也可以分配更多的 RAM,但我怀疑这对我可用的 RAM 量没有多大帮助(我认为 4GB 就足够了)。
assembly - 汇编中时序主循环中代码对齐的影响
假设我有以下主循环
我计时的方法是将它放在另一个像这样的长循环中
我发现我选择的对齐方式会对时间产生重大影响(高达 +-10%)。我不清楚如何选择代码对齐方式。我可以想到三个地方我可能想要对齐代码
- 在函数的入口处(参见
triad_fma_asm_repeat
下面的代码) - 在重复我的主循环的外循环(
.L1
上面)的开始处 - 在我的主循环开始时(
.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 代码
最后一个警告: ALIGN 和 ALIGNB 相对于节的开头起作用,而不是最终可执行文件中地址空间的开头。例如,当您所在的部分只能保证与 4 字节边界对齐时,对齐到 16 字节边界是浪费精力。同样,NASM 不会检查该部分的对齐特性是否适合使用 ALIGN 或 ALIGNB。
我不确定代码段是获得一个绝对的 32 字节对齐地址还是只有一个相对地址。
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 上组装。
assembly - yasm 中的分段错误(核心转储)
我是汇编编程的新手。我写了你看到的代码,这意味着在汇编中是冒泡排序的。但是当我用山药编译它时,我得到了错误“分段错误(核心转储)”。顺便说一句,我正在运行我的程序
在 ubuntu 系统上。首先感谢您的帮助,我确实重写了我的程序。但我仍然遇到同样的错误。多亏了 gdb,我现在知道这是数组的堆栈溢出。但我不知道如何解决它。如果我注释掉下面的 2 行,它工作正常:
现在这里是其余的一起。