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

c++ - YASM 程序集在 jited 函数中调用 stdout.write

我正在尝试编写一个即时编译器,但我有一段不想工作的代码。我的平台是 x86-64 ubuntu。

我有以下用 yasm 编写的代码:

因此,如果我理解正确,这应该写入A标准输出。现在我编译这段代码

这导致了以下机器代码:

然后我用 C++ 读取生成的代码并调用它:

我认为 C++ 部分很好,因为我已经尝试过简单的算术运算并且效果很好。

所以无论如何都没有分段错误,代码似乎已执行但没有任何反应,stdout 中没有任何内容。

有什么建议吗?

//编辑:完整的 C++ 代码:

0 投票
1 回答
1618 浏览

c++ - Cmake:构建 YASM 源文件

我正在使用 CMake 3.4.1 生成和构建 Visual Studio 2013 64 位 C++ 解决方案。其中一个项目还包含我们在 VisualStudio 中使用 yasm 汇编器作为 lib 编译的 .asm 文件。如何配置 CMake 以对这些文件使用 yasm?我还没有找到任何有关如何设置它的示例的文档。

0 投票
0 回答
175 浏览

linux - 64 位汇编:为什么 ld 使用 32 位系统调用,而不是 64 位系统调用?

我想知道为什么我必须使用来自/usr/include/asm/unistd_32.h, not unistd_64.h的系统调用号,即使我正在使用 64 位寄存器并使用(我认为)适当的命令进行组装和链接:

文件 hello.asm 是(我知道我在 32.h 中使用数字 4 进行写入,使用数字 1 进行退出,因为使用 64.h 中的数字不起作用。那里的 Write 是 1,并且退出 60,我尝试了没有结果的那些。)

file在可执行文件和目标文件上返回:

目标文件:ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

可执行:ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

/usr/include/unistd.h的是:

如果你已经通过这篇文章做到了这一点,你就会知道为什么我的“你好世界”程序说“嘿你美女”:我喜欢我的电脑像酒吧里的一个肮脏的老人一样跟我说话.

0 投票
2 回答
750 浏览

c - 调用c函数的yasm程序编译或链接失败

yasm在 linux ( ) 上尝试从汇编代码 ( ) 调用 c 函数时x86-64,执行失败。


代码

function_call_c.asm:

编译:

执行时:

它提示:

bash: ./a.out: 没有这样的文件或目录

a.out确实存在,并且有执行权限。

使用objdump,获取可执行文件的信息:

使用readelf,获取可执行文件的信息:


问题是:

  • 为什么执行失败,是代码错误吗?还是我以错误的方式编译它?
0 投票
1 回答
127 浏览

linux - 我创建的文件名末尾的额外字符

我正在尝试学习汇编程序,但本教程遇到了问题http://www.tutorialspoint.com/assembly_programming/assembly_file_management.htm

除了写出文件时,它工作得很好而且很漂亮。取而代之的是myfile.txt,它被命名为myfile.txtWelcome to Tutorials PointWritten to file?

我似乎无法找出原因。我从教程中删除了源代码,它做了同样的事情。

有人能告诉我为什么吗?


我正在使用 nasm 2.12.02。我也在 yasm 1.2.0 上尝试过,所以我很确定这是汇编代码造成的。

我正在建造和运行OpenSUSE Linux 3.16.7-35-default #1 SMP Sun Feb 7 17:32:21 UTC 2016 (832c776) x86_64 x86_64 x86_64 GNU/Linux

0 投票
1 回答
375 浏览

c - 将编译后的代码与 NASM 和 MSVC 链接时未解决的参考

我正在尝试将程序集(用 编译)与/yasm编译的对象结合起来,我试图将(用)链接到 a中,然后将其链接到最终的可执行文件。msvccl.exelink.exe.dll

从源代码创建对象文件和从这些对象创建 dll 都可以正常工作。

在最后一步中,将.dll与可执行文件链接会出现以下错误:

我正在使用 C。尽管 Win64 没有名称修饰,但我尝试了多种方案(如_xxx_xxxxor __imp_xxx_xxxx)。

检查目标文件会dumpbin.exe显示所有符号:

但不在从以下导出的符号中.dll

即使我已将声明标记为在内部导出.dll,使用__declspec(dllexport).

任何想法如何满足链接器并告诉他符号确实存在?

0 投票
1 回答
807 浏览

assembly - gdb 对于 .bss 中的符号与 .data 中的符号的行为不同

我最近开始使用 YASM 为 Intel x86-64 架构学习汇编语言。在解决一本书(Ray Seyfarth)中提出的一项任务时,我遇到了以下问题:

当我将一些字符放入 .bss 部分的缓冲区时,在 gdb 中调试它时仍然看到一个空字符串。将字符放入 .data 部分的缓冲区中会按预期在 gdb 中显示。

在 gdb 中我得到:

  • 在 LINE 1: 之后x/s &buf,结果 -0x7ffff7dd2740 <buf>: ""

  • 在 LINE 2: 之后x/s &str_test,结果 -0x601030: "A"

看起来&buf没有评估到正确的地址,所以它仍然看到全零。根据其 0x7ffff7dd2740 不在被调试进程的 BSS 中/proc/PID/maps,因此这没有任何意义。 为什么&buf评估到错误的地址,但&str_test评估到正确的地址?两者都不是“全局”符号,但我们确实使用调试信息构建。

在 x86-64 Ubuntu 15.10 上使用 GNU gdb (Ubuntu 7.10-1ubuntu2) 7.10 进行测试。

我正在建造

nm在可执行文件上显示正确的符号地址:

(编者注:我重写了很多问题,因为奇怪的是 gdb 的行为,而不是 OP 的 asm!)。

0 投票
1 回答
91 浏览

assembly - 当我使用与寻址模式相同的表达式计算地址时,为什么 gdb 没有显示 BSS 数组中的变化?

在 .bss 段中编写了带有大缓冲区的简单程序

然后尝试增加某个数组单元格的值。

仍然在 gdb 中,在第三条指令执行之前和之后看到相同的值(0)。

当我尝试检查存储到的地址时,为什么我仍然看到 0?

0 投票
2 回答
189 浏览

c - 无法使 libtool 合并 yasm 创建的目标文件

我正在努力获得libtoolyasm一起工作。

yasm.o files从我的来源创建正确的.asm,但我无法弄清楚如何libtool构建关联.lo.dep文件。它想要构建共享库,合并.o文件。

0 投票
1 回答
156 浏览

x86-64 - 为什么没有用零填充

为 10000 位分配的数组 = 1250 字节(10000/8):

测试指针:

已分配内存:

试图用零填充分配的内存:

检查第一个字节:

检查最后一个字节(0 - 第一个字节,1249 - 最后一个字节)

已解决的问题 应该输入x/1c $rax + 1249