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

assembly - 为什么 YASM 不能识别关键字“offset”?

我正在尝试编译天堂之门

使用以下代码:

但 YASM 告诉我:

不是offset关键字吗?为什么我会收到此错误?

0 投票
2 回答
2119 浏览

linux - 汇编:为什么跳转到通过 ret 返回的标签会导致分段错误?

Linux 汇编教程指出:

有一件非常重要的事情要记住:如果你打算从一个过程中返回(使用 RET 指令),不要跳到它!如“从不!” 这样做会在 Linux 上导致分段错误(这没关系——你的程序所做的只是终止),但在 DOS 中它可能会以不同程度的可怕程度在你的脸上爆炸。

但我不明白为什么它会导致分段错误。这听起来就像从一个函数返回。

我有一种情况需要实现“如果发生 X,则调用过程 A。否则,调用过程 B”的逻辑。除了像袋鼠编织意大利面条码一样跳来跳去还有什么别的办法吗?

0 投票
1 回答
242 浏览

windows - 如何使用 yasm 在 MS Windows 中写入控制台?

我尝试了这段代码(使用中断),但它适用于 DOS:

0 投票
6 回答
81459 浏览

c - 在不调试的情况下查找哪个汇编指令导致了非法指令错误

在运行我用汇编编写的程序时,Illegal instruction出现错误。有没有办法知道是哪条指令导致了错误,而无需调试,因为我正在运行的机器没有调试器或任何开发系统。换句话说,我在一台机器上编译并在另一台机器上运行。我无法在我正在编译的机器上测试我的程序,因为它们不支持 SSE4.2。尽管如此,我正在运行程序的机器确实支持 SSE4.2 指令。

我想这可能是因为我需要告诉汇编程序(YASM)识别 SSE4.2 指令,就像我们通过传递-msse4.2标志来处理 gcc 一样。或者你认为这不是原因?知道如何告诉 YASM 识别 SSE4.2 指令吗?

也许我应该捕获SIGILL信号,然后对 SA_SIGINFO 进行解码,看看程序做了什么样的非法操作。

0 投票
4 回答
25564 浏览

assembly - YASM/NASM x86 程序集中立即数与方括号的基本使用

假设我声明了以下内容:

这些说明如下section .text

我是否正确理解 bl 将包含值 5,而 cl 将包含变量的内存地址buffer

我对两者之间的区别感到困惑

  • 将立即数移入寄存器,
  • 将寄存器移动到立即数(什么进入,数据或地址?)和
  • 将立即数移入不带括号的寄存器
    • 例如,mov cl, buffervsmov cl, [buffer]

更新:阅读回复后,我认为以下摘要是准确的:

  • mov edi, array将第零个数组索引的内存地址放入edi. 即标签地址。
  • mov byte [edi], 3将 VALUE 3 放入数组的第零个索引中
  • 之后add edi, 3edi现在包含数组的第三个索引的内存地址
  • mov al, [array]将第零索引处的 DATA 加载到al.
  • mov al, [array+3]将第三个索引处的 DATA 加载到al.
  • mov [al], [array]无效,因为x86 不能对 2 个显式内存操作数进行编码,并且因为al只有 8 位,即使在 16 位寻址模式下也不能使用。 引用内存位置的内容。(x86 寻址模式)
  • mov array, 3是无效的,因为你不能说“嘿,我不喜欢array存储的偏移量,所以我称之为 3”。立即数只能是源操作数。
  • mov byte [array], 3将值 3 放入数组的第零个索引(第一个字节)。 需要说明byte来避免带有内存、立即操作数的指令的字节/字/双字之间的歧义。否则,这将是一个汇编时错误(操作数大小不明确)。

请说明其中任何一个是否是错误的。(编者注:我修复了语法错误/歧义,因此有效的实际上有效的 NASM 语法。并链接了其他问答以获取详细信息)

0 投票
2 回答
1481 浏览

assembly - 在 x86 NASM 或 YASM 程序集中实现选择排序的麻烦

我正在尝试在 64 位 Linux 上运行的 NASM 中实现一个数组的选择排序。

数组声明为:

排序算法本身很简单,但我觉得受到两件事的限制:可用寄存器的数量,以及无法交换立即数(即括号)

我需要跟踪未排序的数组边界、它的索引、当前最小值的位置以及它的索引。那已经是四个寄存器了。我还需要跟踪两个循环计数器,一个用于表示未排序数组边界的外循环,另一个用于每次遍历的迭代(即内循环)。那是另外两个,总共六个寄存器。

由于立即数不能相互移动,例如mov [var1], [var2]当我需要交换两个元素时,我需要使用寄存器作为临时占位符。在跟踪哪些寄存器保存哪些信息方面,这很快变得笨拙!

以下是我迄今为止的尝试。请注意,这是触发分段错误的非工作代码。但也许你能察觉到我想要做什么,并指出我的方法哪里出了问题。

我不希望使用简化结构的宏,例如那些提供 .IF 和 .ELSE 的宏。

0 投票
2 回答
2220 浏览

assembly - 调试用 yasm 创建的汇编代码

我需要一些帮助来查找和使用一个好的调试器,用于在 64 位 Linux 上用 yasm 组装的 asm 代码。gdb 调试器一直抱怨没有加载符号表。stackoverflow 上的某个人建议使用 -dstabs 开关进行组装,但这对我来说没有什么区别。ddd 也没有什么不同。

如果我能找到摆脱“未加载符号表”问题的方法,gdb 就不会那么糟糕了。我还需要能够查看寄存器和其他声明的内容。

我使用汇编我的 asm 文件yasm -f elf -m amd64 file.asm并链接到ld file.o -o file. 使用 yasm-l开关创建 .lst 文件似乎也不起作用。

我发现的关于这个问题的所有建议似乎都与使用 gcc 作为链接器而不是 ld 有关。我需要能够与 ld 链接。

0 投票
2 回答
1834 浏览

assembly - NASM 汇编代码中的分段错误

我的汇编程序是 YASM,我在 64 位 Linux 上编码。

yasm -f elf -m amd64 -g dwarf2 filename.asm我使用 ld组装和链接

我正在尝试实现选择排序。rdirsi指向strbuf2 resb 10数组的各个部分。这种分段错误的原因可能是什么?第 105 行和第 106 行执行完全相同类型的操作,那么为什么它在第 106 行而不是第 105 行崩溃呢?

我已经包含了代码的相关部分,以及崩溃时的 gdbtui 屏幕截图。

更新:计数器已修复

分段错误 gdb 输出

0 投票
1 回答
339 浏览

assembly - 将间接寻址的值移入 AL 有效,但将其移入 8 位 rXb 寄存器在 yasm 中不起作用

我在 .data 中声明了一个字节数组的字符

我已将 rdi 设置为指向该数组的基本索引

在某些时候,我想将数组中的一个字符放入一个 8 位寄存器中。下面的第一条语句产生一个有效值,但第二条语句void在输入 gdb 命令时导致 r9b 包含print $r9b

寄存器 r8b 到 r15b 中的任何一个都具有相同的效果。据我了解,alr9b都是 8 位的,那么为什么一个可以工作,而另一个不能呢?我的预感是,虽然它们都是 8 位大小,但它们有一些我无法理解的细微差别。

英特尔文档指出:

“REX 前缀用于生成 64 位操作数大小或引用寄存器 R8-R15。”

这与我的问题有关吗?

0 投票
5 回答
18236 浏览

linux - 即使我已经安装它也找不到 yasm

我遇到了一个奇怪的问题。我试图安装 x264。运行 sudo ./configure --enable-shared 时,它给出:

发现没有汇编器 最低版本是 yasm-0.7.0 如果你真的想不使用 asm 编译,用 --disable-asm 配置。

但是我已经安装了 yasm-0.7.0,为了证明,我运行 yasm --version,它给出了:

* yasm 0.7.0.2066 于 2012 年 5 月 8 日编译。版权所有 (c) 2001-2008 Peter Johnson 和其他 Yasm 开发人员。运行 yasm --license 以获取许可概述和摘要。*

我把yasm安装到/usr/local/yasm,为什么找不到yasm?