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

c - 如何从汇编中调用用 C 编写的代码?

已解决的问题 应该使主符号全局,以便链接器在链接时可以在目标文件中找到它。更正的代码。

在执行任务时,尝试从程序集(YASM 汇编器)中调用简单的 C 函数:

写了C函数:

编写调用汇编代码:

编译的程序集:

编译的c代码:

试图将两个目标文件链接到单个可执行二进制文件中:

得到:

您对如何更正命令/代码以构建可执行文件有任何建议吗?是的,我读过类似的问题(虽然使用 NASM 汇编器,但没有解决方案有效)。

0 投票
1 回答
253 浏览

macos - yasm 以 x86_64 mach-o 格式写入 PAGEZERO

我正在关注一本使用 yasm 汇编器和 ld 链接器的汇编书。我在 OSX 10.12 上,我正在尝试组装成 Mach-O 格式。不幸的是,我收到了分段错误。这是原始的 .asm 文件:

我编译它:

yasm -f macho64 -m amd64 -l memory.lst -o memory.o memory.asm

链接它:

ld 内存.o -o 内存

并在 lldb 中运行它,我收到此错误:

  • 线程 #1:tid = 0xb3b4b,0x0000000000000001,停止原因 = EXC_BAD_ACCESS(代码=1,地址=0x1)帧 #0:0x0000000000000001 错误:从 __PAGEZERO 部分读取数据时出错

在 lldb 中,我运行了“目标模块转储部分”,我看到它的 __PAGEZERO 段定义如下:

[0x0000000000000000-0x0000000000001000) --- 内存.__PAGEZERO

我查看了一个用 clang 构建的普通 Mach-O 二进制文件,__PAGEZERO 段如下所示:

[0x0000000000000000-0x0000000100000000) --- 测试.__PAGEZERO

然后我注意到它实际上是创建 PAGEZERO 段的链接器。我相信 clang 使用了一个名为“lld”的特殊链接器。我的问题是:

  1. 我的错误实际上是由从 PAGEZERO 读取引起的吗?
  2. 如果是这样,我可以告诉我的链接器(ld)以正确的大小定义 PAGEZERO 吗?
0 投票
1 回答
527 浏览

windows - 在 yasm x86 程序集中初始化结构

我正在尝试初始化一个 WIN32_FIND_DATA 结构,在该结构中存储有关使用 FindFirstFile 和 FindNextFile windows 函数找到的文件的信息。问题是我不知道如何在 yasm 中初始化一个结构。这是我的代码:

我得到的错误是:

0 投票
0 回答
625 浏览

linux - 无法解释的分段错误在 x86-64 yasm 程序集中运行到 gdb 中的断点

我正在 Oracle Enterprise Linux 7.3 VM 上学习 x86-64 程序集。我有一个简单的程序,它在 gdb 之外运行良好,但如果我设置断点并运行程序,则会出现分段错误。我已经将它缩减为一个非常小的程序,但想知道我是否做错了什么,或者它是否只是一个 gdb 错误。这是文件 ex1.asm 的源代码:

我像这样组装、链接它并在 gdb 中运行它:

以下是 gdb 会话的运行方式:

我有一个简单的解决方法。我只是在 _start 标签之后添加了一个不需要的异或。

删除 ltop 标签也可以,但是我为这个示例缩减的较大的原始程序需要该标签,所以这不是一个很好的解决方法。

有点奇怪。也许有一些明显的我做错了,但它看起来更像是一个 gdb 错误。

谢谢,鲍比

基于评论的附加信息:

看来评论可能是正确的。如果我正确读取转储,则 move to ebx 语句从 4000b5 开始,但断点设置在 mov 指令字节内的 4000ba 处。

这就是我注释掉 ltop 标签时发生的情况:

断点位于转储中的 0x4000b5 处:

谢谢回复。

我使用 nasm 使用此命令行重新进行了此操作:

它工作得很好。因此,正如评论所建议的,这似乎是 yasm 和调试的问题。

0 投票
1 回答
311 浏览

assembly - 如何组织汇编代码?

当没有适当的代码组织规则时,汇编代码往往会变得非常混乱。任何人都可以建议一些有用的代码组织技术,包括宏、过程等吗?

0 投票
1 回答
366 浏览

assembly - 编译程序集文件时出现重定位 R_x86_64_32 错误。在一个虚拟机上工作,而不是在另一个虚拟机上工作

控制台返回给我的完整错误如下。我在 VirtualBox 和 VMware 上使用 Lubuntu(都试过了)。出于某种原因,它可以在我的笔记本电脑上运行,但不能在我的台式机上运行。在尝试通过许多消息论坛自己了解更多信息之后,我的系统上的 ld 本身似乎有问题,但我不够熟练,无法找出问题所在。我知道“1 退出状态”意味着失败,但仅此而已。我不知道为什么它失败了。如果它将在一台机器上而不是另一台机器上运行,则与我的代码无关。

我正在编程的语言是使用 YASM 编译器的汇编语言。编译脚本链接在错误代码下方

错误代码:

编译脚本:

请注意,虽然上面的脚本稍微复杂一些,但像下面这样的简单脚本也不起作用。

0 投票
0 回答
230 浏览

assembly - fmul 到 st1 在指令后给出“意外的`,'”

使用 反汇编Color Dream demoscene 制作的.com文件时,我得到以下输出:ndisasm

DCC9被反汇编为fmul to st1也与Salent 反汇编程序中的列表相对应。

到目前为止一切都很好。

但是,当用 组装fmul to st1指令时yasm,我得到:

而不是预期的DCC9机器代码。

我的问题是:

我怎样才能fmul to st1以一种yasm可以理解的方式写作?

0 投票
2 回答
3959 浏览

linux - 使用 YASM 构建 x264:ASM 检查失败

我的问题是,“我有新的 yasm,我认为 x264 应该很酷,为什么 x264 不酷?”

由于某些原因,我正在按照此处的指南构建一个包含从头开始的 ffmpeg 构建的 CentOS docker 映像(基于 centos:latest) 。这是一个很好的指南,它以前对我有用,所以我感觉很好。

今天我在 libx264 构建点上遇到了瓶颈:具体来说,我说

我得到回复

找不到汇编程序

最低版本为 nasm-2.13

如果你真的想在没有 asm 的情况下进行编译,请使用 --disable-asm 进行配置。

这是出乎意料的。我有 yasm,我知道它是 1)在那里做 nasm 所做的事情,但更好,2)考虑到我大约一个小时前从它的 repo 中取出它,并建立它,成为最新鲜的最现代版本五十九分钟前。对于它的价值,nasm 也在包装盒上,因为说明要求它,但它低于他们规定的版本(即它是“2014 年 6 月 9 日编译的 NASM 版本 2.10.07”)

所以似乎没有找到yasm。还有另一个StackExchange question提到了这个问题,结果是一个路径问题。因此,我将 yasm 添加到我的路径中,如下所示:

这仍然产生了 Found-no-assembler 问题。作为最后一个令人困惑的方法,我明确地告诉脚本我想为变量 $AS 使用什么,因为根据我对配置的快速了解,这看起来像是 yasm/nasm 应该去的地方。命令变为:

这至少给了

找到 yasm 1.3.0

最低版本为 nasm-2.13

如果你真的想在没有 asm 的情况下进行编译,请使用 --disable-asm 进行配置。

查看 config.log 我看到以下内容:

那么:这里有什么问题?我的假设是 yasm drop-in 取代了 nasm 不好吗?yasm 是否适合此目的,但我没有向 ./configure 提供正确的信息?就这个先决条件而言,我为 CentOS 构建 ffmpeg 的说明是否已经过时,我应该更加努力地获得现代 nasm?

0 投票
0 回答
62 浏览

assembly - YASM 排除对象二进制中不必要的模块的参数是什么?

yasm、ld、gcc可以排除不需要的部分吗?我希望 gcc 像在 C/C++ 中一样排除它。

我用这些命令编译和链接。

testSize1.o 的大小大于 testSize2.o。

0 投票
1 回答
754 浏览

c - Polygot 包含 nasm/yasm 和 C 的文件

我有一堆幻数,我想将它们包含在 C 程序和由 nasm 或 yasm 编译的程序集文件中。

在纯 C 中,该文件看起来像是一系列定义,例如:

在 nasm 或 yasm 中,相同的包含可以实现为:

唯一的区别是 : 之前的前导字符define用于#C 和%nasm。

有什么方法可以编写一个 polygot 包含,允许我将它包含在 C 和 nasm 中,并且只列出一次常量?

是的,我知道我可以只使用sed或从另一个文件生成一个文件。