问题标签 [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.
c - 如何从汇编中调用用 C 编写的代码?
已解决的问题 应该使主符号全局,以便链接器在链接时可以在目标文件中找到它。更正的代码。
在执行任务时,尝试从程序集(YASM 汇编器)中调用简单的 C 函数:
写了C函数:
编写调用汇编代码:
编译的程序集:
编译的c代码:
试图将两个目标文件链接到单个可执行二进制文件中:
得到:
您对如何更正命令/代码以构建可执行文件有任何建议吗?是的,我读过类似的问题(虽然使用 NASM 汇编器,但没有解决方案有效)。
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”的特殊链接器。我的问题是:
- 我的错误实际上是由从 PAGEZERO 读取引起的吗?
- 如果是这样,我可以告诉我的链接器(ld)以正确的大小定义 PAGEZERO 吗?
windows - 在 yasm x86 程序集中初始化结构
我正在尝试初始化一个 WIN32_FIND_DATA 结构,在该结构中存储有关使用 FindFirstFile 和 FindNextFile windows 函数找到的文件的信息。问题是我不知道如何在 yasm 中初始化一个结构。这是我的代码:
我得到的错误是:
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 和调试的问题。
assembly - 如何组织汇编代码?
当没有适当的代码组织规则时,汇编代码往往会变得非常混乱。任何人都可以建议一些有用的代码组织技术,包括宏、过程等吗?
assembly - 编译程序集文件时出现重定位 R_x86_64_32 错误。在一个虚拟机上工作,而不是在另一个虚拟机上工作
控制台返回给我的完整错误如下。我在 VirtualBox 和 VMware 上使用 Lubuntu(都试过了)。出于某种原因,它可以在我的笔记本电脑上运行,但不能在我的台式机上运行。在尝试通过许多消息论坛自己了解更多信息之后,我的系统上的 ld 本身似乎有问题,但我不够熟练,无法找出问题所在。我知道“1 退出状态”意味着失败,但仅此而已。我不知道为什么它失败了。如果它将在一台机器上而不是另一台机器上运行,则与我的代码无关。
我正在编程的语言是使用 YASM 编译器的汇编语言。编译脚本链接在错误代码下方
错误代码:
编译脚本:
请注意,虽然上面的脚本稍微复杂一些,但像下面这样的简单脚本也不起作用。
assembly - fmul 到 st1 在指令后给出“意外的`,'”
使用 反汇编Color Dream demoscene 制作的.com
文件时,我得到以下输出:ndisasm
DCC9
被反汇编为fmul to st1
也与Salent 反汇编程序中的此列表相对应。
到目前为止一切都很好。
但是,当用 组装fmul to st1
指令时yasm
,我得到:
而不是预期的DCC9
机器代码。
我的问题是:
我怎样才能fmul to st1
以一种yasm
可以理解的方式写作?
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?
assembly - YASM 排除对象二进制中不必要的模块的参数是什么?
yasm、ld、gcc可以排除不需要的部分吗?我希望 gcc 像在 C/C++ 中一样排除它。
我用这些命令编译和链接。
testSize1.o 的大小大于 testSize2.o。
c - Polygot 包含 nasm/yasm 和 C 的文件
我有一堆幻数,我想将它们包含在 C 程序和由 nasm 或 yasm 编译的程序集文件中。
在纯 C 中,该文件看起来像是一系列定义,例如:
在 nasm 或 yasm 中,相同的包含可以实现为:
唯一的区别是 : 之前的前导字符define
用于#
C 和%
nasm。
有什么方法可以编写一个 polygot 包含,允许我将它包含在 C 和 nasm 中,并且只列出一次常量?
是的,我知道我可以只使用sed
或从另一个文件生成一个文件。